(69) numpy配列の浅いコピー深いコピー

投稿者: | 2014年9月13日

12,009 views

この記事は最終更新から 1816日 が経過しています。

numpy配列を普通に代入した場合、参照が返される。
すなわち、代入して作った新しい変数は、代入元のオブジェクトを指し示しているだけだ。
このため、一方への変更が他方にも反映される。

>>> import numpy as np
>>> a = np.random.randint(1,10,(3,4))
>>> a
array([[8, 1, 4, 5],
       [4, 9, 9, 9],
       [8, 3, 5, 5]])
>>>
>>> b = a
>>> b[2,2] = -1
>>> b
array([[ 8,  1,  4,  5],
       [ 4,  9,  9,  9],
       [ 8,  3, -1,  5]])
>>> a
array([[ 8,  1,  4,  5],
       [ 4,  9,  9,  9],
       [ 8,  3, -1,  5]])

numpy.copy を使用した場合、別オブジェクトが生成される。
こちらの場合、一方のオブジェクトの変更が他方に反映されない。

>>> a = np.random.randint(1,10,(3,4))
>>> a
array([[8, 4, 7, 7],
       [2, 6, 3, 7],
       [9, 8, 2, 5]])
>>>
>>> c = a.copy()
>>> c
array([[8, 4, 7, 7],
       [2, 6, 3, 7],
       [9, 8, 2, 5]])
>>> c[2,2] = -1
>>> c
array([[ 8,  4,  7,  7],
       [ 2,  6,  3,  7],
       [ 9,  8, -1,  5]])
>>> a
array([[8, 4, 7, 7],
       [2, 6, 3, 7],
       [9, 8, 2, 5]])

注意してプログラムを書かないと、データが次々と破壊されて困ることになりそう…


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です