NumPy配列のコピー 2015/04/01
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.asarray
は np.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は変わらない。コピー前の ndarr1
と ndarr2
は同じサイズである必要がある。
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
関連