はじめに
少しハマってしまったところなのでメモ。
NumPyでは、あるndarrayオブジェクトを明示的に参照する手段としてviewがあります。
numpy.ndarray.view — NumPy v1.19 Manual
使用例:
>>> x = np.arange(0,5) >>> x array([0, 1, 2, 3, 4]) >>> y = x.view() >>> y array([0, 1, 2, 3, 4]) >>> y[2] = 5 >>> y array([0, 1, 5, 3, 4]) >>> x array([0, 1, 5, 3, 4])
view である y
の要素を変更すると、参照元であるx
も同様に変更されていることが確認できます。
本題
以上の例で、 y
がx
を参照していることを確認します。
試しに、単純にオブジェクトのidで比較してみましたが、別のIDとなっており、比較できませんでした。
どうやら、view の仕様としてview自体のオブジェクトがあるようです。
>>> id(x), id(y) (2486640856640, 2486641978624) >>> type(x), type(y) (<class 'numpy.ndarray'>, <class 'numpy.ndarray'>)
解決方法
1. y.baseを使う
view はbase
属性からベースオブジェクトを呼び出すことができるため、以下のように比較することができました。
>>> id(x), id(y.base) (2486640856640, 2486640856640) >>> >>> y.base is x True
2. np.shares_memory()を使う
np.shares_memory()
では、引数として与えた2つのndarrayオブジェクトがメモリを共有しているかどうかを確認することができます。
>>> np.shares_memory(x, y)
True
参考
NumPy配列ndarrayがビューかコピーか、メモリを共有しているか判定 | note.nkmk.me
numpy: ndarray オブジェクトのメソッド view()