Cargue el archivo de texto como cadenas usando numpy.loadtxt ()

Me gustaría cargar un archivo de texto grande (alrededor de 1 GB con 3 * 10 ^ 6 filas y 10 – 100 columnas) como una matriz np 2D que contiene cadenas. Sin embargo, parece que numpy.loadtxt () solo toma flotantes como predeterminados. ¿Es posible especificar otro tipo de datos para toda la matriz? He intentado lo siguiente sin suerte:

loadedData = np.loadtxt(address, dtype=np.str) 

Recibo el siguiente mensaje de error:

 /Library/Python/2.7/site-packages/numpy-1.8.0.dev_20224ea_20121123-py2.7-macosx-10.8-x86_64.egg/numpy/lib/npyio.pyc in loadtxt(fname, dtype, comments, delimiter, converters, skiprows, usecols, unpack, ndmin) 833 fh.close() 834 --> 835 X = np.array(X, dtype) 836 # Multicolumn data are returned with shape (1, N, M), ie 837 # (1, 1, M) for a single row - remove the singleton dimension there ValueError: cannot set an array element with a sequence 

¿Algunas ideas? (No sé el número exacto de columnas en mi archivo de antemano).

Utilice genfromtxt en genfromtxt lugar. Es un método mucho más general que loadtxt :

 import numpy as np print np.genfromtxt('col.txt',dtype='str') 

Utilizando el archivo col.txt :

 foo bar cat dog man wine 

Esto da:

 [['foo' 'bar'] ['cat' 'dog'] ['man' 'wine']] 

Si espera que cada fila tenga el mismo número de columnas, lea la primera fila y establezca el atributo filling_values para corregir las filas faltantes.

También hay read_csv en Pandas , que es rápido y admite separadores de columnas sin coma y escritura automática por columnas:

 import pandas as pd df = pd.read_csv('your_file',sep='\t') 

Se puede convertir en una matriz NumPy si prefiere ese tipo con:

 import numpy as np arr = np.array(df) 

Este es, con mucho, el enfoque de importación de texto más fácil y más maduro que he encontrado.

¿Es esencial que necesites una matriz NumPy? De lo contrario, podría acelerar el proceso cargando los datos como una lista anidada.

 def load(fname): ''' Load the file using std open''' f = open(fname,'r') data = [] for line in f.readlines(): data.append(line.replace('\n','').split(' ')) f.close() return data 

Para un archivo de texto con palabras de 4000×4000 esto es aproximadamente 10 veces más rápido que loadtxt .