Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

NumPyのビュー(view)がどのndarrayオブジェクトを参照しているか確認する方法

はじめに

少しハマってしまったところなのでメモ。

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 も同様に変更されていることが確認できます。

本題

以上の例で、 yxを参照していることを確認します。

試しに、単純にオブジェクトの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()

f:id:Kurene:20201029000621p:plain