5

a+=b と a=a+b の違いのような基本的な python 参照は理解していますが、これは私を混乱させます。

import numpy as np
arr1 = np.arange(6).reshape(2,3)
arr2 = arr1[0]
arr2 is arr1[0] #returns False, when I expect True
arr1[0] = [7,8,9]
arr2 #[7,8,9], when I expect [0,1,2] since the 'is' returned False

何が起きてる?

4

5 に答える 5

8

numpy 配列にインデックスを付けると、新しいビュー (それ自体が numpy 配列) が作成されます。これは別のオブジェクトなのでis失敗しますが、正直に、実際に、ハードウェア上の同じメモリのビューです。したがって、そのビューを変更すると、別のビューが存在する可能性のあるメモリのビットが変更されます。

ctypes.data編集:配列の属性を調べることで、numpy配列に関連付けられたメモリの開始アドレスを実際に確認できます。

In [1]: import numpy as np

In [2]: arr1 = np.arange(6).reshape(2,3)

In [3]: arr2 = arr1[0]

In [4]: arr2.ctypes.data
Out[4]: 39390224

In [5]: arr1[0].ctypes.data
Out[5]: 39390224

同じ!

于 2013-05-21T17:10:41.627 に答える