¿Cómo se usa python numpy.savetxt para escribir cadenas y números flotantes en un archivo ASCII?


1 Answers

La respuesta actualmente aceptada en realidad no aborda la pregunta, que pregunta cómo guardar listas que contienen tanto cadenas como números flotantes. Para completar, proporciono un ejemplo completamente funcional, que se basa, con algunas modificaciones, en el enlace dado en @joris comment.

import numpy as np

names  = np.array(['NAME_1', 'NAME_2', 'NAME_3'])
floats = np.array([ 0.1234 ,  0.5678 ,  0.9123 ])

ab = np.zeros(names.size, dtype=[('var1', 'U6'), ('var2', float)])
ab['var1'] = names
ab['var2'] = floats

np.savetxt('test.txt', ab, fmt="%10s %10.3f")

Actualización: Este ejemplo también funciona correctamente en Python 3 mediante el uso del tipo de cadena Unicode 'U6' , al crear la matriz ab estructurada , en lugar de la cadena de bytes 'S6' . Este último tipo funcionaría en Python 2.7, pero escribiría cadenas como b'NAME_1' en Python 3.

python list numpy output

Tengo un conjunto de listas que contienen cadenas y números flotantes, como:

import numpy as num

NAMES  = num.array(['NAME_1', 'NAME_2', 'NAME_3'])
FLOATS = num.array([ 0.5    , 0.2     , 0.3     ])

DAT =  num.column_stack((NAMES, FLOATS))

Quiero apilar estas dos listas y escribirlas en un archivo de texto en forma de columnas; por lo tanto, quiero usar numpy.savetxt (si es posible) para hacer esto.

num.savetxt('test.txt', DAT, delimiter=" ") 

Cuando hago esto, aparece el siguiente error:

>>> num.savetxt('test.txt', DAT, delimiter=" ") 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/numpy-1.8.0.dev_9597b1f_20120920-py2.7-macosx-10.8-x86_64.egg/numpy/lib/npyio.py", line 1047, in savetxt
    fh.write(asbytes(format % tuple(row) + newline))
TypeError: float argument required, not numpy.string_

El archivo de salida ideal se vería así:

NAME_1    0.5
NAME_2    0.2
NAME_3    0.3

¿Cómo puedo escribir cadenas y números flotantes en un archivo de texto, posiblemente evitando el uso de csv (quiero hacerlo si es legible para otras personas)? ¿Hay alguna otra forma de hacer esto en lugar de usar numpy.savetxt ?



Related