使用genfromtxt创建带空列的numpy数组
我正在使用 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]])