25

我想将一个大文本文件(大约 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

有任何想法吗?(我事先不知道我的文件中的确切列数。)

4

4 回答 4

51

改为使用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以修复任何缺失的行。

于 2013-02-20T16:50:59.723 回答
16

Pandas中也有read_csv,它速度快,支持非逗号列分隔符和按列自动键入:

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

如果您更喜欢该类型,则可以将其转换为 NumPy 数组:

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

这是迄今为止我遇到的最简单、最成熟的文本导入方法。

于 2014-03-20T19:44:00.213 回答
2

您是否需要一个 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.

于 2013-02-21T14:56:03.380 回答
2

np.loadtxt(file_path, dtype=str) 在此处输入图像描述

于 2021-04-11T08:45:28.343 回答