向numpy recarray添加行

6
有没有一种简单的方法可以向numpy recarray中添加记录/行而不创建新的recarray?假设我有一个recarray,它在内存中占用1Gb,我想能够添加一行到它里面,而不必让Python暂时占用2Gb的内存。
1个回答

10

您可以使用具有一个更多行的形状调用 yourrecarray.resize,然后分配给该新行。当然,如果numpy没有足够的空间来就地扩展数组,则可能仍需要完全分配新的存储器,但至少您有机会!-)

由于请求示例,下面是修改过的规范示例列表...:

>>> import numpy
>>> mydescriptor = {'names': ('gender','age','weight'), 'formats': ('S1', 'f4', 'f4')} 
>>> a = numpy.array([('M',64.0,75.0),('F',25.0,60.0)], dtype=mydescriptor)
>>> print a
[('M', 64.0, 75.0) ('F', 25.0, 60.0)]
>>> a.shape
(2,)
>>> a.resize(3)
>>> a.shape
(3,)
>>> print a
[('M', 64.0, 75.0) ('F', 25.0, 60.0) ('', 0.0, 0.0)]
>>> a[2] = ('X', 17.0, 61.5)
>>> print a
[('M', 64.0, 75.0) ('F', 25.0, 60.0) ('X', 17.0, 61.5)]

你能展示一些演示代码吗?我的尝试调用arr.resize()以ValueError告终:无法调整此数组的大小:它不拥有其数据。 - unutbu
1
@unutbu,好的,我编辑了答案并提供了一个简单的例子。您可能会遇到本主题讨论的问题:http://aspn.activestate.com/ASPN/Mail/Message/numpy-discussion/3042521 -- 此时,您可以像Travis Oliphant在那里提到的那样,在调用resize时添加refcheck=0参数来修复它们(除非您已经共享了数据,在这种情况下就不能再原地调整大小了(请注意,Travis在numpy SVN head中提到的功能现在已经成为定期发布的numpy的一部分了,该主题已经有3年以上了;-)。 - Alex Martelli
3
希望NumPy的开发人员能够想到更好的方法来添加数据集中的一行。这是一个非常常见的操作,我不明白为什么它会如此低效。 - dalloliogm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接