2012-05-25 13 views
5

Sto cercando di utilizzare numpy.loadtxt per leggere i dati in un file che assomiglia a questo:numpy.loadtxt dà "non iterabile" Errore

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

E quando gli ho dato questo:

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

O anche questo:

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

dice, TypeError: 'int' object is not iterable

Ho pensato che fosse perché le prime due colonne erano chiaramente numeri interi non float, ma ora non sono nemmeno sicuro di quale oggetto int si riferisca, perché non leggerà nemmeno i float. Come lavoro loadtxt?

Correlati: Come si specifica il formato di più colonne utilizzando dtype = ? Non riesco a trovarlo tramite Google.

risposta

1

In questo caso è difficile sapere che cosa sta causando il problema, perché non ci hai fornito informazioni sufficienti. Dato quello che hai postato qui, il codice dovrebbe funzionare:

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

Naturalmente, come kindall 's risposta indica, il tuo secondo esempio non riuscirà perché usecols non accetta singoli numeri interi; it requires a sequence. ((1) è solo 1 tra parentesi, per creare una tupla, è necessario una virgola in là - (1,).)

Ecco un esempio di come utilizzare dtype per specificare il formato di più colonne:

>>> 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 è solo un nome file, bf = "beamtest.out" –

+0

@LoonUnit, guarda la mia modifica. Risponde almeno alla seconda parte della tua domanda (su 'dtype'). Ho provato il tuo primo esempio e dovrebbe funzionare perfettamente. – senderle

+0

sì, penso che finirò per usare la tua risposta a lungo termine. –

9

Nel secondo esempio, è probabile che il problema sia usecols=(2). usecols deve essere una sequenza. (2) è il numero intero 2, non una tupla di un elemento contenente 2, ed è probabile che si stia lamentando del messaggio di errore: loadtxt() sta tentando di ripetere su uno int. Utilizzare (2,) (o [2] se si preferisce).

+0

usecols è l'opzione che specifica quali colonne leggere. Vedi: http://docs.scipy.org/doc/numpy-1.4.x/reference/generated/numpy.loadtxt.html –

+0

@LoonUnit: ho sicuramente capito cos'è 'usecols', motivo per cui lo so deve essere una sequenza. Come ho detto nella mia risposta, '(2)' non è una sequenza, è l'intero 2. – kindall

+0

Ok, l'amico ha spiegato la tua risposta ed è stata alla fine corretta. usecols = (2,) ha funzionato. –

Problemi correlati