2013-07-09 12 views
7

mam numpy tablicy, gdzie każda wartość jest pływak, a następnie przez liczbę całkowitą, npZapisywanie numpy tablica z danymi mieszanych

my_array = numpy.array([0.4324321, 0, 0.9437212, 1, 0.4738721, 0, 0.49327321, 0]) 

Chciałbym zapisać w następujący sposób:

0.4324321 0 0.9437212 1 0.4738721 0 0.49327321 0 

Ale jeśli zadzwonię:

numpy.savetxt('output.dat',my_array,fmt='%f %i') 

pojawia się błąd:

AttributeError: fmt has wrong number of % formats. %f %i 

Jak mogę rozwiązać ten problem?

+1

'savetxt' nie jest członkiem' array' typu. Czy chodziło Ci o 'numpy.savetxt'? – abarnert

+0

Nawiasem mówiąc, naprawdę pomogłoby, gdybyś pokazał, jak ma wyglądać oczekiwany wynik, zamiast zgadywać. To nie przypadek, że co najmniej dwa różne inteligentnych ludzi nie czytać w twoich myślach (albo dwa różne inteligentne osoby plus jeden, który jest tylko tak mądry jak ja, nie jestem pewien Domyślałem prawo albo) ... – abarnert

+0

@abarnert Dzięki za komentarze, Edytowałem post, aby rozwiązać oba te problemy. – rhombidodecahedron

Odpowiedz

7

Twój prawdziwym problemem jest to, że wypisanie 1D 8-elementowa tablica daje 8 rzędów 1 kolumny (lub, jeśli zmusi rzeczy, 1 rzędzie 8 kolumn), a nie 4 rzędy 2 kolumnach. Możesz więc określić tylko jeden format (lub, jeśli wymusisz, 1 lub 8 formatów).

Jeśli chcesz wstawić ten w kształcie 4x2 zamiast 1x8, trzeba przekształcić tablicę pierwszy:

numpy.savetxt('output.dat', my_array.reshape((4,2)), fmt='%f %i') 

To daje:

0.432432 0 
0.943721 1 
0.473872 0 
0.493273 0 

The docs są nieco mylące , ponieważ poświęcają większość sformułowań na radzenie sobie z liczbami zespolonymi zamiast prostych znaków i int, ale podstawowe zasady są takie same. Użytkownik określa albo pojedynczy specyfikator, albo specyfikator dla każdej kolumny (przypadek pośredni określania części rzeczywistych i urojonych dla każdej kolumny jest nieistotny).


Jeśli chcesz napisać go w 1 rzędzie 8 kolumn, należy najpierw przekształcić go w coś z 1 rzędu 8 kolumn zamiast 8 rzędach.

A potem trzeba podać 8 formatów. Nie ma sposobu, aby powiedzieć numpy „Powtórz te dwa formaty cztery razy”, ale jest to dość łatwe do zrobienia bez pomocy NumPy za:

numpy.savetxt('output.dat', my_array.reshape((1,8)), fmt='%f %i ' * 4) 

I to daje:

0.432432 0 0.943721 1 0.473872 0 0.493273 0 
+0

Właściwie to chcę format 1x8. Czy to możliwe? – rhombidodecahedron

+0

1x8, a nie 8x1? OK, pokażę, jak to zrobić. – abarnert

1

Problemem jest to, że savetxt() będzie wydrukuj jeden wiersz dla każdego wpisu tablicy. Można wymusić 2D-array tworząc nową oś, a następnie wydrukować w formacie (1x8):

numpy.savetxt('output.dat', my_array[numpy.newaxis,:], fmt='%f %i'*4)