我的代码发现了一个奇怪的情况,问题显示在下面的代码中
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
据我了解,sreca
或ireca
应该保留reca
的引用,除非我直接为它们分配新值,但ireca
在{分配。我不知道这是否是预期的。
有人建议我如何避免这种情况吗?
顺便说一下,我发现代码的一个小变化(例如reca['n1'] = ['a']*10
)会给我这个样本中的所有True
,这真让我感到困惑。
答案 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'
中的第一个组件而不是1
,7
然后您想要查看它是否仍在父数组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