numpy recarray的花式索引在分配后丢失了参考

时间:2014-08-27 14:51:54

标签: python list numpy indexing recarray

我的代码发现了一个奇怪的情况,问题显示在下面的代码中

import numpy as np

dt = dict(names = ['n1','n2'], formats = ['a8','int'])
reca = np.recarray((10,), dtype = dt)
reca['n1'] = ['a','b','c','d','e','f','g','e','f','g']
reca['n2'] = range(10)

sreca = reca[::2]
print sreca[0] in reca

sreca[0]['n2'] = 12
print sreca[0] in reca

ireca = reca[[1,3,5,7]]
print ireca[0] in reca

ireca[0]['n2'] = 7
print ireca[0] in reca

输出结果为:

True
True
True
False

据我了解,srecaireca应该保留reca的引用,除非我直接为它们分配新值,但ireca在{分配。我不知道这是否是预期的。

有人建议我如何避免这种情况吗?

顺便说一下,我发现代码的一个小变化(例如reca['n1'] = ['a']*10)会给我这个样本中的所有True,这真让我感到困惑。

2 个答案:

答案 0 :(得分:2)

recarray中使用花式索引会将数据复制到新数组。相反,你可以这样做:

ireca = [reca[i] for i in [1,3,5,7]]

因为只取一个重新排列的条目保留了引用。您可以使用flags参数检查何时创建新阵列:

  • print(reca[0].flags)显示OWNDATA : False
  • print(reca[[0,1]].flags)显示OWNDATA : True

答案 1 :(得分:0)

您首先为ireca分配了以下组件:

>>> ireca = reca[[1,3,5,7]]
>>> ireca 
rec.array([('b', 1), ('d', 3), ('f', 5), ('e', 7)], 
      dtype=[('n1', 'S8'), ('n2', '<i8')])

然后您分配到'n2'中的第一个组件而不是17然后您想要查看它是否仍在父数组reca中并且由于第二个组件已更改,因此它不再位于reca中,因此您获得False结果。

>>> ireca[0]['n2']=7
>>> ireca[0]
('b', 7)
>>> ireca
rec.array([('b', 7), ('d', 3), ('f', 5), ('e', 7)], 
      dtype=[('n1', 'S8'), ('n2', '<i8')])

>>> print ireca[0] in reca
False