2011-06-27 15 views
14

Chcę użyć numpy.savetxt(), aby zapisać tablicę złożonych liczb w pliku tekstowym. Problemy:Jak zapisać i załadować tablicę liczb złożonych za pomocą numpy.savetxt?

  • Jeśli zapiszesz złożoną tablicę z domyślnym łańcuchem formatowania, część urojona zostanie odrzucona.
  • Jeśli używasz fmt='%s', to numpy.loadtxt() nie może załadować go, chyba że podasz dtype=complex, converters={0: lambda s: complex(s)}. Nawet wtedy, jeśli w macierzy znajdują się NaN, ładowanie nadal kończy się niepowodzeniem.

Wygląda jakby ktoś pytał o tym multipletimes na liście mailingowej NumPy a nawet złożył bug, ale nie dostał odpowiedzi. Zanim skończę coś ze sobą, czy istnieje kanoniczny sposób na zrobienie tego?

Odpowiedz

11

Łatwiej i oszczędza kilka tymczasowych tablic, aby ponownie zinterpretować tablicę jako prawdziwą tablicę.

Oszczędność:

numpy.savetxt('outfile.txt', array.view(float)) 

Załadunek:

array = numpy.loadtxt('outfile.txt').view(complex) 

Jeśli wolisz mieć rzeczywistą i urojoną część na tej samej linii w pliku, można użyć

numpy.savetxt('outfile.txt', array.view(float).reshape(-1, 2)) 

lub

array = numpy.loadtxt('outfile.txt').view(complex).reshape(-1) 

odpowiednio.

(Zauważ, że ani view() ani reshape() kopiuje tablicy - to tylko reinterpretacji tych samych danych w inny sposób.)

Uzupełnienie od pytającego pytanie:

Jeśli chcesz zaoszczędzić więcej niż jednego złożonego tablicy w tym samym pliku, możesz zrobić to tak:

numpy.savetxt('outfile.txt', numpy.column_stack([ 
    array1.view(float).reshape(-1, 2), 
    array2.view(float).reshape(-1, 2), 
])) 

array1, array2 = numpy.loadtxt('outfile.txt', unpack=True).view(complex) 

przywracania kształtu jest konieczne, ponieważ nie numpy.view() działają na macierzach kroczowych.

+0

Doskonale! Krótki i elegancki. – ptomato

2

Oto moje rozwiązanie, na wypadek, gdyby ktoś zadał to pytanie Google.

Oszczędność:

numpy.savetxt('outfile.txt', numpy.column_stack([array.real, array.imag])) 

Załadunek:

array_real, array_imag = numpy.loadtxt('outfile.txt', unpack=True) 
array = array_real + 1j * array_imag 

będę nadal udzielać zaznaczenie do lepszego rozwiązania!

Powiązane problemy