2015-02-10 14 views
11

Zastanawiam się, jak poprawnie zapisać i załadować dane numpy.array. Obecnie używam metody numpy.savetxt(). Na przykład, jeśli mam tablicę markers, który wygląda tak:Jak poprawnie zapisać i załadować dane numpy.array()?

enter image description here

próbuję zapisać go przez zastosowanie:

numpy.savetxt('markers.txt', markers) 

w innych skrypt próbuję otworzyć zapisany wcześniej plik:

markers = np.fromfile("markers.txt") 

A to co mam ...

enter image description here

danych zapisanych pierwszy wygląda następująco:

0.000000000000000000e+00 
0.000000000000000000e+00 
0.000000000000000000e+00 
0.000000000000000000e+00 
0.000000000000000000e+00 
0.000000000000000000e+00 
0.000000000000000000e+00 
0.000000000000000000e+00 
0.000000000000000000e+00 
0.000000000000000000e+00 

Ale kiedy zapisać tylko załadowane dane przy użyciu tej samej metody, tj. numpy.savetxt() Wygląda to tak:

1.398043286095131769e-76 
1.398043286095288860e-76 
1.396426376485745879e-76 
1.398043286055061908e-76 
1.398043286095288860e-76 
1.182950697433698368e-76 
1.398043275797188953e-76 
1.398043286095288860e-76 
1.210894289234927752e-99 
1.398040649781712473e-76 

Co robię źle? PS nie ma żadnej innej "backstage" operacji, którą wykonuję. Po prostu zapisuję i ładuję, i to właśnie dostaję. Z góry dziękuję.

+0

Jaki jest wynik pliku tekstowego? Dlaczego po prostu nie pisać do pliku CSV? –

+1

Czy trzeba zapisywać i ładować jako pliki tekstowe czytelne dla człowieka? Będzie szybciej (a pliki będą bardziej kompaktowe), jeśli zapisujesz/ładujesz pliki binarne używając 'np.save()' i 'np.load()'. –

+0

Dziękuję za poradę. Pomogło. Czy możesz jednak wyjaśnić, dlaczego tak właśnie jest i czy istnieje sposób na zapisywanie danych w formacie * .txt i ładowanie go bez bólu głowy? Na przykład, gdy chce się pracować z Matlab, Java lub innymi narzędziami/językami. – bluevoxel

Odpowiedz

29

Najbardziej niezawodnym sposobem znalazłem to zrobić jest użycie np.savetxt z np.loadtxt i nie np.fromfile który lepiej nadaje się do plików binarnych pisemnych z tofile. Metody np.fromfile i np.tofile zapisują i odczytują pliki binarne, podczas gdy np.savetxt zapisuje plik tekstowy. Tak więc, na przykład:

In [1]: a = np.array([1, 2, 3, 4]) 
In [2]: np.savetxt('test1.txt', a, fmt='%d') 
In [3]: b = np.loadtxt('test1.txt', dtype=int) 
In [4]: a == b 
Out[4]: array([ True, True, True, True], dtype=bool) 

czyli

In [5]: a.tofile('test2.dat') 
In [6]: c = np.fromfile('test2.dat', dtype=int) 
In [7]: c == a 
Out[7]: array([ True, True, True, True], dtype=bool) 

używam dawną metodę nawet jeśli jest wolniejszy i tworzy większe pliki (czasami): format binarny może być platforma zależne (na przykład format pliku zależy od endianness systemu).

Jest niezależny Formatplatforma dla tablic numpy, które można zapisać i odczytać z np.save i np.load:

In [8]: np.save('test3.npy', a) # .npy extension is added if not given 
In [9]: d = np.load('test3.npy') 
In [10]: a == d 
Out[10]: array([ True, True, True, True], dtype=bool) 
+6

Pliki '.npy' (na przykład generowane przez' np.save() ') * są * niezależne od platformy i będą bardziej kompaktowe i szybsze do tworzenia niż pliki tekstowe. –

+0

Dzięki, zapomniałem o tym wspomnieć. Edytowane. – xnx

1

np.fromfile() ma argumentu sep= kluczowe:

Separator między elementami jeśli plik jest plikiem tekstowym. Pusty ("") separator oznacza, że ​​plik powinien być traktowany jako plik binarny. Spacje ("") w separatorze dopasowują zero lub więcej znaków białych znaków. Separator składający się tylko z spacji musi pasować do co najmniej jednego spacji.

Domyślna wartość sep="" oznacza, że ​​np.fromfile() próbuje go odczytać jako pliku binarnego zamiast pliku tekstowym rozdzielone przestrzennie, dzięki czemu uzyskać wartości nonsensowne powrotem. Jeśli używasz np.fromfile('markers.txt', sep=" ") otrzymasz wynik, którego szukasz.

Jednakże, jak inni zwrócili uwagę, np.loadtxt() jest preferowanym sposobem konwersji plików tekstowych do NumPy tablic, i chyba że plik musi być czytelny dla człowieka jest zazwyczaj lepiej zamiast używać formatów binarnych (np np.load()/np.save()) .

Powiązane problemy