NumPy配列のコピー

np.array の引数にはPythonの配列だけでなくndarrayも渡すことができて、いずれも新しいndarrayを生成する。ndarrayを渡した場合は配列のコピーになる。

ndarr1 = np.array([1, 2, 3])
ndarr2 = np.array(ndarr1)
ndarr2[0] = 10

print(ndarr1)
# 出力結果
# [1 2 3]

print(ndarr2)
# 出力結果
# [10  2  3]

np.asarraynp.array とほとんど同じように使えるが、引数にndarrayを渡した場合は配列のコピーをせずに引数をそのまま返す。

ndarr1 = np.array([1, 2, 3])
ndarr2 = np.asarray(ndarr1)
ndarr2[0] = 10

print(ndarr1)
# 出力結果
# [10  2  3]

print(ndarr2)
# 出力結果
# [10  2  3]

以下のようにスライス表記を左辺に使うと、既存の配列に上書きコピーすることができる。

# ndarr1の内容をndarr2にコピー
ndarr2[:] = ndarr1

ndarr2 の変数自体を書き換えるのではなく、ndarr2 の変数が指している配列の要素をすべて ndarr1 と同じにするものなので、オブジェクトのIDは変わらない。コピー前の ndarr1ndarr2 は同じサイズである必要がある。

ndarr1 = np.array([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]])
ndarr2 = np.array([[10., 20., 30.], [40., 50., 60.], [70., 80., 90.]])

print(ndarr1)
# 出力結果
# [[ 1.  2.  3.]
#  [ 4.  5.  6.]
#  [ 7.  8.  9.]]

print(id(ndarr1))
# 出力結果
# 139997439646016

print(ndarr2)
# 出力結果
# [[ 10.  20.  30.]
#  [ 40.  50.  60.]
#  [ 70.  80.  90.]]

print(id(ndarr2))
# 出力結果
# 139997439646336

ndarr2[:] = ndarr1

print(ndarr2)
# 出力結果
# [[ 1.  2.  3.]
#  [ 4.  5.  6.]
#  [ 7.  8.  9.]]

# idはコピー前と変わらない
print(id(ndarr2))
# 出力結果
# 139997439646336

左辺をスライス表記ではなく、変数名そのままにすると、それは単に右辺のオブジェクトを代入するだけになるので、配列のコピーにはならない。コピー前の ndarr2 は違う大きさの配列だろうが他のものだろうが構わないが、それは単に上書きの代入であるから。

ndarr1 = np.array([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]])
ndarr2 = np.array([[10., 20., 30.], [40., 50., 60.]])

print(ndarr1)
# 出力結果
# [[ 1.  2.  3.]
#  [ 4.  5.  6.]
#  [ 7.  8.  9.]]

print(id(ndarr1))
# 出力結果
# 139784224438592

print(ndarr2)
# 出力結果
# [[ 10.  20.  30.]
#  [ 40.  50.  60.]]

print(id(ndarr2))
# 出力結果
# 139784224438912

ndarr2 = ndarr1

print(ndarr2)
# 出力結果
# [[ 1.  2.  3.]
#  [ 4.  5.  6.]
#  [ 7.  8.  9.]]

# idはコピー元と同じになる
print(id(ndarr2))
# 出力結果
# 139784224438592

関連

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。