Python NumPy / ndarray のメソッド #3

株式会社リュディアです。今回も NumPy についてまとめていきます。

前回までの NumPy / ndarray のメソッドについてのまとめへのリンクは以下を参考にしてください。

以下のリンクの内容を元にまとめを作っていきます。

今回は Array conversion に分類されるメソッドのうち copy(), view() についてまとめます。

まずcopy() と view() の違いを文章で書いてみます。copy() は ndarray の複製を作ります。view() は ndarray への参照を作ります。一言で書くとこのような説明になるのですが、具体例を見ていきましょう。

import numpy as np

x = np.array([[1, 2, 3], [4, 5, 6]], np.int32)

x_copy = x.copy()
x_copy[0,0] = 100
print(x_copy)
print(x)

#
# [[100   2   3]
#  [  4   5   6]]
#
# [[1 2 3]
#  [4 5 6]]
#

元の配列 x をコピー、つまり複製して x_copy というオブジェクトを作りました。x_copy の要素 [0, 0] である 1 を 100 で上書きしています。実際、x_copy は x とは実体が別なので 行列 x_copy[0,0] は 100 になっていますが x[0,0] は 1 のままです。

次に view() を使ってみます。

import numpy as np

x = np.array([[1, 2, 3], [4, 5, 6]], np.int32)

x_view = x.view()
x_view[0,0] = 100
print(x_view)
print(x)

#
# [[100   2   3]
#  [  4   5   6]]
# [[100   2   3]
#  [  4   5   6]]
#

copy() の代わりに view() を使っているだけですが、違いとして x_view[0, 0] = 100 として上書きすると x[0, 0] も 100 になっていることがわかりますね。view() では複製が作られるのではなく、元の x と同じ実体を指す別名が生成されると考えてください。そのため x_view の値を変更すると x にも変更が反映されてしまいます。

view() は copy() と違い、実体が 1つなのでメモリ使用量は増えませんので効率のよい処理が可能です。ただうっかり書き込んでしまうと元データにも反映されてしまうので注意が必要です。

最後に以下の例も見てください。

import numpy as np

x = np.array([[1, 2, 3], [4, 5, 6]], np.int32)

x_equal = x
x_equal[0,0] = 100
print(x_equal)
print(x)

#
# [[100   2   3]
#  [  4   5   6]]
# [[100   2   3]
#  [  4   5   6]]
#

copy() も view() も使わず x_equal = x としています。単に = を使っているのですが結果は view() と同様ですね。ndarray で = を使った場合は view であることに注意して使う必要があります。ご注意ください。

NumPy / ndarray のメソッドに関するまとめの続きは以下からどうぞ。

では、ごきげんよう。


この記事が気に入ったらサポートをしてみませんか?