我想加载一个大文本文件(大约1 GB,3 * 10 ^ 6行和10 - 100列)作为包含字符串的2D np数组。但是,似乎numpy.loadtxt()仅将浮点值作为默认值。是否可以为整个阵列指定另一种数据类型?我没试过就试过以下内容:
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
有什么想法吗? (我事先不知道我文件中的确切列数。)
答案 0 :(得分:39)
请改用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
以修复任何缺失的行。
答案 1 :(得分:14)
Pandas中还有read_csv
,速度很快,支持非逗号列分隔符并按列自动输入:
import pandas as pd
df = pd.read_csv('your_file',sep='\t')
如果您喜欢使用以下类型,则可将其转换为NumPy数组:
import numpy as np
arr = np.array(df)
这是迄今为止我遇到的最简单,最成熟的文本导入方法。
答案 2 :(得分:2)
np.loadtxt(file_path, dtype=str)
答案 3 :(得分:1)
您是否需要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字的文本文件,这比loadtxt
快10倍。