2016-04-11 34 views
9

mam numpy tablicę z danych liczbowych w postaci:Saving numpy tablicy do csv produkuje TypeError Niezgodność

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

więc jest to tablica 10 grupach, gdzie każda grupa składa się z 2 list o równej długości i zawiera tylko liczby. uruchamiając następujące Zapisz kod daje mi błąd poniżej:

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

Zgaduję, to może być ustalona z czymś w FMT = „xyz” argumentu, ale dokumentacja nie jest szczególnie wyraźny. Każda pomoc będzie doceniona.

(Z moich danych rzeczywistych, I i J listy są listami długich pływaków, eg'0.0047322940571' etc.)

+1

Spróbuj 'przykładowy = numpy.array ([[[float (I), i in range (0, 5)] , [0 dla j w zakresie (0, 5)]] dla k w zakresie (0, 10)]) 'i sprawdź, czy błąd nie zniknął. Alternatywnie wypróbuj format '' fmt = '% 04d'' w komendzie 'savetxt'. – vmg

+0

@vmg W moim rzeczywistym kodzie dane dla i i j są zmiennymi, myślę, że błąd wynika z faktu, że nie oczekuje trzeciej wartości w k. – Pingk

+0

Jaki jest kształt tablicy? 'savetxt' działa tylko z tablicami 2d. Jaki jest jego "dtype"? – hpaulj

Odpowiedz

10

swojej example jest 3D array

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]]]) 

próbuje zapisz całość powoduje błąd (inna wiadomość ze względu na inną wersję):

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

ale sav ing jeden wiersz „” jest ok

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

Zapisz w formacie liczby całkowitej sprawia ładniejsza wyjście

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 

Więc jak chcesz 3d tablica być zbawiony? Pamiętaj, że będziesz go używać/czytać. Wiele plików? Wiele bloków w jednym pliku?

https://stackoverflow.com/a/3685339/901925 to 6-letnia odpowiedź na pytanie, jak zapisać tablicę 3d. Prostą odpowiedzią jest otworzenie pliku i wykonanie wielu wycinków z tablicy . To zapisuje dane w blokach. Ale ładowanie tych bloków to kolejne pytanie SO (które pojawiło się wcześniej).

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 
# ==== 

W odpowiedzi na Twój komentarz, to działa

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

Innym sposobem na zaoszczędzenie 3d tablica jest do przekształcenia go do 2d. Ci przekształcić go z powrotem do 3d po załadunku, ewentualnie za pomocą informacji, które przechowywane w wierszu komentarza

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

Dzięki, ale teraz otrzymuję inny błąd za pomocą linii In [100] i "fmt =%. 18e". Moja aktualna tablica ma kształt (4L, 2L, 100L) i pojawia się błąd TypeError: Niedopasowanie między tablicą dtype ("float64") i specyfikatorem formatu ('% .18e% .18e ... [x100]) – Pingk

+0

'savetxt' iteruje na 1. wymiarze twojej tablicy, a dla każdego' wiersza', pisze 'format% tuple (wiersz)'. 'format' pochodzi od twojego parametru' fmt' i '.shape [1]' twojego wejścia. – hpaulj

+0

Dziękuję bardzo! – 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

Próbowałem fmt = '% 1.10E,% 1.10E, & 04d' dla i, j i k odpowiednio, ale dostaję SyntaxError. Problem wydaje się być iterowaniem przez listę k? – Pingk

+0

Zaktualizowany, powinno to rozwiązać problem. – Chris