2012-05-25 19 views
5

Próbuję użyć numpy.loadtxt do odczytywania danych w pliku, który wygląda tak:numpy.loadtxt daje "nie iterable" Błąd

## 14 line of header 
3 0 36373.7641026 
3 1 36373.7641026 
3 2 36373.7641026 
... 

A kiedy daję to:

>>> chunk, power = numpy.loadtxt(bf,skiprows=14,usecols=(1,2),unpack=True) 

Albo jeszcze tak:

>>> power = numpy.loadtxt(bf,skiprows=14,usecols=(2)) 

mówi TypeError: 'int' object is not iterable

Zakładam, że to dlatego, że dwie pierwsze kolumny były wyraźnie liczbami całkowitymi, ale nie mam pewności, który obiekt int się odsyła, ponieważ nie będzie nawet czytał tylko obiektów pływających. Jak mogę wykonać loadtxt?

Powiązane: Jak określić format wielu kolumn przy użyciu dtype = ? Mam problem z ustaleniem go za pośrednictwem google.

Odpowiedz

1

Trudno powiedzieć, co powoduje problem w tym przypadku, ponieważ nie dostarczyłeś nam wystarczających informacji. Biorąc pod uwagę to, co pan pisał tutaj Twój kod powinien działać:

>>> with open('beamtest.out', 'r') as f: 
...  f.readlines() 
... 
['header 0\n', 'header 1\n', 'header 2\n', 'header 3\n', 'header 4\n', 
'header 5\n', 'header 6\n', 'header 7\n', 'header 8\n', 'header 9\n', 
'header 10\n', 'header 11\n', 'header 12\n', 'header 13\n', 
'3 0 36373.7641026\n', '3 1 36373.7641026\n', '3 2 36373.7641026'] 
>>> chunk, power = numpy.loadtxt('beamtest.out', skiprows=14, 
           usecols=(1,2), unpack=True) 
>>> chunk 
array([ 0., 1., 2.]) 
>>> power 
array([ 36373.7641026, 36373.7641026, 36373.7641026]) 

Oczywiście, jak kindall „s odpowiedź wskazuje, drugi przykład zawiedzie bo usecols nie akceptuje pojedynczych liczb całkowitych; to requires a sequence. ((1) tylko 1 w nawiasie; tworzyć krotki, trzeba przecinek tam - (1,).)

Oto przykład jak używać dtype aby określić format wielu kolumnach:

>>> record = numpy.loadtxt('beamtest.out', skiprows=14, usecols=(1, 2), 
          dtype={'names':('chunk', 'power'), 
            'formats':('i8', 'f8')}) 
>>> record 
array([(0, 36373.7641026), (1, 36373.7641026), (2, 36373.7641026)], 
     dtype=[('chunk', '<i8'), ('power', '<f8')]) 
>>> record['chunk'] 
array([0, 1, 2]) 
>>> record['power'] 
array([ 36373.7641026, 36373.7641026, 36373.7641026]) 
+0

bf to po prostu nazwa pliku, bf = "beamtest.out" –

+0

@LoonUnit, spójrz na moją edycję. Co najmniej odpowiada na drugą część twojego pytania (o 'dtype'). Przetestowałem twój pierwszy przykład i powinien on działać idealnie. – senderle

+0

tak, myślę, że w końcu wykorzystam twoją odpowiedź na dłuższą metę. –

9

W twoim drugim przykładzie problem prawdopodobnie jest następujący: usecols=(2). usecols musi być sekwencją. (2) jest liczbą całkowitą 2, a nie jednoczęściową, zawierającą 2, i prawdopodobnie komunikat o błędzie narzeka na: loadtxt() próbuje powtórzyć numer int. Użyj (2,) (lub [2], jeśli wolisz).

+0

usecols to opcja określająca kolumny do odczytania. Zobacz: http://docs.scipy.org/doc/numpy-1.4.x/reference/generated/numpy.loadtxt.html –

+0

@LoonUnit: Z pewnością rozumiem, czym jest 'usecols', dlatego go znam musi być sekwencją. Jak już powiedziałem w mojej odpowiedzi, '(2)' nie jest sekwencją, jest liczbą całkowitą 2. – kindall

+0

Dobrze, przyjacielu wyjaśniłem twoją odpowiedź i ostatecznie było to poprawne. usecols = (2,) działało. –

Powiązane problemy