1

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

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应该保留一个引用,但在分配后丢失了它的引用。我不知道这是否是预期的。recaireca

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

顺便说一句,我发现代码的一个小改动(reca['n1'] = ['a']*10例如)会给我True这个示例中的所有内容,这真的让我感到困惑。

4

2 回答 2

2

在 a 中使用精美的索引recarray会将数据复制到新数组中。相反,你可以这样做:

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

因为只取recarray的一个条目会保留参考。flags您可以使用以下参数检查何时创建了新数组:

  • print(reca[0].flags)节目OWNDATA : False
  • print(reca[[0,1]].flags)节目OWNDATA : True
于 2014-08-27T15:16:26.373 回答
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
于 2014-08-27T15:16:10.850 回答