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

ファンシー インデックスを使用するrecarrayと、データが新しい配列にコピーされます。代わりに、次のことができます。

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

再配列のエントリを 1 つだけ取得すると、参照が保持されるためです。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が、2 番目のコンポーネントが変更されたので、もはや含まれていないため、結果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 に答える