2016-04-11 29 views
9

Ho una matrice NumPy con dati numerici della forma:estivo matrice NumPy a csv produce TypeError Mismatch

example = numpy.array([[[i for i in range(0, 5)],[0 for j in range(0, 5)]] for k in range(0, 10)]) 

Quindi è array di 10 gruppi, dove ogni gruppo composto da 2 liste di uguale lunghezza e contiene un'unica numeri. L'esecuzione del seguente codice di salvataggio mi dà il seguente errore:

numpy.savetxt('exampleData.csv', test, delimiter=',') 
TypeError: Mismatch between array dtype ('int32') and format specifier ('%.18e %.18e') 

Sto indovinando questo potrebbe essere risolto con qualcosa nel fmt = argomento 'xyz', ma la documentazione non è particolarmente chiaro. Qualsiasi aiuto sarebbe apprezzato.

(Nel mio dati reali, le liste iej sono liste di lunghi carri, eg'0.0047322940571' etc.)

+1

Prova 'esempio = numpy.array ([[[galleggiante (i) per i in range (0, 5)] , [0 per j nel range (0, 5)]] per k nel range (0, 10)]) 'e vedere se l'errore persiste. In alternativa, prova un formato come 'fmt = '% 04d'' nella' savetxt'call. – vmg

+0

@vmg Nel mio codice attuale, i dati per i e j sono entrambi float, penso che l'errore deriva dal fatto che non si aspetta un terzo valore in k. – Pingk

+0

Qual è la forma della matrice? 'savetxt' funziona solo con array 2d. Qual è il suo 'dtype'? – hpaulj

risposta

10

tuo example è una matrice 3d

In [82]: example=np.array([[[i for i in range(0, 5)],[0 for j in range(0, 5)]] for k in range(0, 3)]) # chg 10 to 3 for display 

In [83]: example.shape 
Out[83]: (3L, 2L, 5L) 

In [84]: example 
Out[84]: 
array([[[0, 1, 2, 3, 4], 
     [0, 0, 0, 0, 0]], 

     [[0, 1, 2, 3, 4], 
     [0, 0, 0, 0, 0]], 

     [[0, 1, 2, 3, 4], 
     [0, 0, 0, 0, 0]]]) 

cercando di salvare l'intero risultati cosa in caso di errore (messaggio diverso a causa della diversa versione):

In [87]: np.savetxt('test.csv',example, delimiter=',') 
.... 
TypeError: float argument required, not numpy.ndarray 

ma sav ing una 'riga' è ok

In [88]: np.savetxt('test.csv',example[1,...], delimiter=',') 

Salva con formato intero fa un'uscita più bella

In [94]: np.savetxt('test.csv',example[1,...], delimiter=',',fmt='%d') 

In [95]: with open('test.csv') as f:print f.read() 
0,1,2,3,4 
0,0,0,0,0 

Così come si desidera che la matrice 3d da salvare? Tieni presente come lo userai/leggerlo. Più file? Più blocchi all'interno di un file?

https://stackoverflow.com/a/3685339/901925 è una risposta SO di 6 anni su come salvare un array 3d. La semplice risposta è aprire un file ed eseguire più savetxt per le sezioni dell'array. Questo salva i dati in blocchi. Ma il caricamento di questi blocchi è un'altra domanda SO (che è emersa prima).

In [100]: with open('test.csv','w') as f: 
    ...:  for row in example: 
    ...:   np.savetxt(f,row,delimiter=',',fmt='%d',footer='====') 
    ...:   

In [101]: with open('test.csv') as f:print f.read() 
0,1,2,3,4 
0,0,0,0,0 
# ==== 
0,1,2,3,4 
0,0,0,0,0 
# ==== 
0,1,2,3,4 
0,0,0,0,0 
# ==== 

In risposta al tuo commento, questo funziona

example=np.ones((4,2,100)) 
np.savetxt('test.csv',example[1,...], delimiter=',',fmt='%.18e') 

Un altro modo per salvare una matrice 3D è quello di rimodellare a 2D. A rimodellare di nuovo a 3d dopo il caricamento, possibilmente utilizzando le informazioni che si è memorizzato in una riga di commento

np.savetxt('test.csv',example.reshape(-1,example.shape[-1]), delimiter=',',fmt='%.18e') 
+0

Grazie, ma ora ricevo un errore diverso utilizzando la riga In [100] e "fmt =%. 18e". Il mio array effettivo ha la forma (4L, 2L, 100L) e ottengo l'errore TypeError: Mismatch tra array dtype ('float64') e identificatore di formato ('% .18e% .18e ... [x100]) – Pingk

+0

'savetxt' scorre sulla prima dimensione della matrice, e per ogni' riga', scrive 'formato% tupla (row)'. 'format' è derivato dal parametro' fmt' e '.shape [1]' del tuo input. – hpaulj

+0

Grazie mille! – Pingk

0
import numpy 

example = numpy.array([[[i for i in range(0, 5)],[0 for j in range(0, 5)]] for k in range(0, 10)]) 
f = open('exampleData.csv', 'ab') 
for i in example: 
    numpy.savetxt(f, i, fmt='%i') 
+0

Ho provato fmt = '% 1.10E,% 1.10E, & 04d' per i, j e k, ma ottengo un SyntaxError. Il problema sembra scorrere tra la lista k? – Pingk

+0

Aggiornato, questo dovrebbe risolvere il problema. – Chris