2012-11-21 16 views
9

Sto provando ad emettere un array float numpy 4D in un file di testo in chiaro usando numpy.savetxtÈ possibile utilizzare numpy.savetxt su Ndarrays N-dimensionali con N> 2?

Tuttavia numpy restituisce un errore nel dire che è richiesto un argomento float quando provo a passare questo array. Tuttavia il doc numpy specifica che l'argomento da passare dovrebbe essere solo array come ... NON dovrebbe essere di max rank 2. L'unico modo per farlo funzionare è rimodellare i dati in 2D (e questo in realtà non è sempre pratico per motivi di organizzazione dei dati)

C'è un modo per aggirare questo? O si deve necessariamente rimodellare la matrice numpy in 2D? Mi aspettavo di essere in grado di leggere i dati in fortran come stile colonna per colonna (lavorando attraverso le dimensioni).

Ci sono altre possibilità? Si noti che non desidero utilizzare il formato npy poiché cerco la compatibilità con un altro programma che richiede il formato di testo normale.

risposta

3

Un approccio diverso è quello di salvare la matrice come semplice elenco di numeri (la versione piatta della matrice) e salvare lungo di essa le informazioni sulla sua forma.

Il problema degli array multidimensionali è che non è così semplice spostarli da un programma all'altro anche in formato testo.

si può fare qualcosa di simile:

myarray = rand(5,5,5) 
name = 'myarray'+myarray.shape+'.txt' 
np.savetxt(name,myarray.flatten()) 

e utilizzare le informazioni sulle dimensioni inclued nel nome del file per ripristinare la forma iniziale

5

Se si guarda il codice sorgente per numpy.savetxt troverete

for row in X: 
     fh.write(asbytes(format % tuple(row) + newline)) 

così numpy.savetxt funziona solo per 1 o 2D-array.

Per interoperabilità, è possibile utilizzare JSON se si dispone di memoria sufficiente per convertire la matrice NumPy a un elenco:

import json 
import numpy as np 
a = np.arange(24).reshape(-1, 2, 3, 4).astype('float') 
a[0,0,0,0] = np.nan 
with open('/tmp/out', 'w') as f: 
    json.dump(a.tolist(), f, allow_nan = True) 

rendimenti

[[[[NaN, 1.0, 2.0, 3.0], [4.0, 5.0, 6.0, 7.0], [8.0, 9.0, 10.0, 11.0]], [[12.0, 13.0, 14.0, 15.0], [16.0, 17.0, 18.0, 19.0], [20.0, 21.0, 22.0, 23.0]]]] 
+0

thx, elegante. non utilizzabile però per i miei scopi. Comunque mi ha fatto scoprire json. Grazie per quello. In ogni caso l'applicazione con cui ho bisogno di comunicare ha sempre bisogno di dati 2D (come ho scoperto). Quindi penso che dipenda solo da me per rimodellare "intelligentemente" la matrice numpy –

Problemi correlati