使用Numpy加载大数据文件?

时间:2017-02-24 23:23:37

标签: python arrays numpy

我正在尝试加载一个大型数组,作为我正在从.dat工作的一个小项目的一部分。

我通常使用numpy.loadtxt从我的文件中读取数据以形成单列数组,如果我的文件是:

1 2 3
1 2 3
1 2 3

我在哪里使用:

x, y, z = np.loadtxt("123.dat", Unpack =True)

将3列分配给数组1,2和3.我正在使用的文件格式如下。

0000000000 4.975124E-03 -3.046211E+00 -1.148806E+00
0000000001 2.543665E-06 -3.661235E+00 -1.038111E+00
0000000002 2.543665E-06 -1.285855E+01 1.251881E+00

此格式在我的文件中重复约52k行。 然而,当我尝试使用相同的方法并尝试使用以下内容时。

i, m, x, y = np.loadtxt("stars.dat", unpack=True)

我收到以下错误。

Traceback (most recent call last):
  File "test.py", line 4, in <module>
    i, m, x, y = np.loadtxt("stars.dat")
ValueError: too many values to unpack (expected 4)

我已经尝试将参数更改为usecols =(1,2 ...)但是这不会将值正确地收集到矩阵中,它会从我的文件中选择未在列中对齐的随机值。

如何解决此错误以及使用Numpy从文件导入大量数据并在将来将它们分配给数组的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

您的样本应按预期解压缩为4个变量。该文件必须有不同之处。该错误表明它找到了超过4列。 usecols的问题进一步表明文件中的列概念与loadtxt看到的列不同。这可能是分隔符的问题。

使用您的样本:

In [114]: txt=b"""0000000000 4.975124E-03 -3.046211E+00 -1.148806E+00
     ...: 0000000001 2.543665E-06 -3.661235E+00 -1.038111E+00
     ...: 0000000002 2.543665E-06 -1.285855E+01 1.251881E+00"""

In [119]: data=np.loadtxt(txt.splitlines())
In [120]: data.shape
Out[120]: (3, 4)
In [121]: data.dtype
Out[121]: dtype('float64')

普通加载找到3行,4列。这样做一个简单的加载是个好主意,以确保你正确地读取文件。

unpack只是转换数组:

In [122]: data=np.loadtxt(txt.splitlines(), unpack=True)
In [123]: data.shape
Out[123]: (4, 3)
In [124]: i,j,k,l=data

然后可以解压缩。解包是对变量元组的正常Python赋值。除了转置loadtxt不对unpack做任何特别的事情。