2012-05-25 21 views
5

Estoy intentando utilizar numpy.loadtxt para leer los datos en un archivo que tiene el siguiente aspecto:numpy.loadtxt da "no iterable" error

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

Y cuando le doy esto:

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

O incluso esto:

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

dice, TypeError: 'int' object is not iterable

Supuse que era porque las dos primeras columnas eran claramente enteros que no flotaban, pero ahora ni siquiera estoy seguro de a qué objeto int se refiere, porque ni siquiera leerá solo los flotadores. ¿Cómo hago que loadtxt funcione?

Relacionados: ¿Cómo especifico el formato de varias columnas usando dtype = ?? Tengo problemas para averiguarlo a través de google.

Respuesta

1

Es difícil saber cuál es la causa del problema en este caso, porque no nos ha dado suficiente información. Dado lo que has publicado aquí, su código debería funcionar:

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

Por supuesto, como kindall 's respuesta indica, su segundo ejemplo fallará porque usecols no acepta números enteros individuales; es requires a sequence. ((1) es sólo 1 entre paréntesis, para crear una tupla, necesita una coma allí - (1,).)

Aquí es un ejemplo de cómo utilizar dtype para especificar el formato de varias columnas:

>>> 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 es solo un nombre de archivo, bf = "beamtest.out" –

+0

@LoonUnit, mira mi edición. Al menos responde la segunda parte de tu pregunta (sobre 'dtype'). Probé tu primer ejemplo, y debería funcionar perfectamente. – senderle

+0

Sí, creo que voy a terminar usando su respuesta a largo plazo. –

9

En su segundo ejemplo, es probable que el problema sea usecols=(2). usecols debe ser una secuencia. (2) es el número entero 2, no una tupla de un elemento que contiene 2, y es probable que el mensaje de error se esté quejando: loadtxt() está intentando iterar sobre int. Use (2,) (o [2] si prefiere).

+0

usecols es la opción que especifica qué columnas leer. Ver: http://docs.scipy.org/doc/numpy-1.4.x/reference/generated/numpy.loadtxt.html –

+0

@LoonUnit: Ciertamente entiendo qué es 'usecols', por eso lo sé debe ser una secuencia Como dije en mi respuesta, '(2)' no es una secuencia, es el entero 2. – kindall

+0

Bien, amigo explicó tu respuesta, y finalmente fue correcta. usecols = (2,) funcionó. –

Cuestiones relacionadas