Подтвердить что ты не робот

Загрузите текстовый файл в виде строк с помощью 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

Любые идеи? (Я не знаю точное количество столбцов в моем файле заранее.)

4b9b3361

Ответ 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.