Загрузите текстовый файл в виде строк с помощью numpy.loadtxt()
Я хотел бы загрузить большой текстовый файл (около 1 GB с 3 * 10 ^ 6 строк и 10 - 100 столбцов) в виде 2D np-массива, содержащего строки. Однако, кажется, что numpy.loadtxt() принимает по умолчанию только float. Можно ли указать другой тип данных для всего массива? Я пробовал следующее без везения:
loadedData = np.loadtxt(address, dtype=np.str)
Появляется следующее сообщение об ошибке:
/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), i.e.
837 # (1, 1, M) for a single row - remove the singleton dimension there
ValueError: cannot set an array element with a sequence
Любые идеи? (Я не знаю точное количество столбцов в моем файле заранее.)
Ответы
Ответ 1
Используйте genfromtxt
. Это гораздо более общий метод, чем loadtxt
:
import numpy as np
print np.genfromtxt('col.txt',dtype='str')
Использование файла col.txt
:
foo bar
cat dog
man wine
Это дает:
[['foo' 'bar']
['cat' 'dog']
['man' 'wine']]
Если вы ожидаете, что каждая строка имеет одинаковое количество столбцов, прочитайте первую строку и установите атрибут filling_values
для исправления любых отсутствующих строк.
Ответ 2
Существует также read_csv
в Pandas, который работает быстро и поддерживает разделители столбцов без запятой и автоматическую типизацию по столбцу:
import pandas as pd
df = pd.read_csv('your_file',sep='\t')
Он может быть преобразован в массив NumPy, если вы предпочитаете этот тип с помощью:
import numpy as np
arr = np.array(df)
Это самый легкий и самый зрелый подход к импортированию текста, с которым я столкнулся.
Ответ 3
Важно ли, чтобы вам нужен массив NumPy? В противном случае вы можете ускорить процесс загрузки данных в виде вложенного списка.
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
Для текстового файла с 4000x4000 словами это примерно в 10 раз быстрее, чем loadtxt
.