使用genfromtxt创建带空列的numpy数组

2 投票
2 回答
1371 浏览
提问于 2025-04-17 14:43

我正在使用 numpy.genfromtxt 导入数据,想要添加一个新字段,这个字段的值是从数据集中某些值计算得来的。因为这是一个结构化数组,所以最简单、最有效的方法就是用 numpy.lib.recfunctions.append_fields() 来添加新列。我在这里找到了一些关于这个库的好介绍 点击这里

有没有办法在不复制数组的情况下做到这一点?比如说,强制 genfromtxt 创建一个空列,然后我可以把计算得来的值加进去?

2 个回答

1

我想让 genfromtxt 读取这个内容:

11,12,13,14,15
21,22,
31,32,33,34,35
41,42,43,,45

我使用了:

import numpy as np
print np.genfromtxt('tmp.txt',delimiter=',',filling_values='0')

但是没有成功。我不得不在输入中添加逗号来表示空列:

11,12,13,14,15
21,22,,,
31,32,33,34,35
41,42,43,,45

然后它就成功了,返回了:

[[ 11.  12.  13.  14.  15.]
 [ 21.  22.   0.   0.   0.]
 [ 31.  32.  33.  34.  35.]
 [ 41.  42.  43.   0.  45.]]
1

这里有一个简单的例子,展示如何使用生成器通过genfromtxt给数据文件添加一个字段。

我们的示例数据文件是data.txt,内容如下:

1,11,1.1
2,22,2.2
3,33,3.3

所以

In [19]: np.genfromtxt('data.txt',delimiter=',')
Out[19]:
array([[  1. ,  11. ,   1.1],
       [  2. ,  22. ,   2.2],
       [  3. ,  33. ,   3.3]])

如果我们创建一个生成器,比如:

def genfield():
    for line in open('data.txt'):
        yield '0,' + line

这个生成器会在文件的每一行前面加上一个以逗号分隔的0,那么:

In [22]: np.genfromtxt(genfield(),delimiter=',')
Out[22]:
array([[  0. ,   1. ,  11. ,   1.1],
       [  0. ,   2. ,  22. ,   2.2],
       [  0. ,   3. ,  33. ,   3.3]])

你也可以用列表推导式来做同样的事情,如下所示:

In [26]: np.genfromtxt(('0,'+line for line in open('data.txt')),delimiter=',')
Out[26]:
array([[  0. ,   1. ,  11. ,   1.1],
       [  0. ,   2. ,  22. ,   2.2],
       [  0. ,   3. ,  33. ,   3.3]])

撰写回答