NumPy 配列のコピーとビュー

コピーとビューの違い

コピーと配列ビューの主な違いは、コピーが新しい配列であること、ビューが元の配列のビューに過ぎないことです。

コピーがデータを持っているため、コピーに対して行われるいかなる変更も元の配列に影響を与えず、元の配列に対して行われるいかなる変更もコピーに影響を与えません。

ビューはデータを持っていません。ビューに対して行われる変更は元の配列に影響を与えますが、元の配列に対して行われる変更はビューに影響を与えます。

コピー:

インスタンス

コピーを行い、元の配列を変更し、2つの配列を表示します:

import numpy as np
arr = np.array([1, 2, 3, 4, 5])
x = arr.copy()
arr[0] = 61
print(arr) 
print(x)

インスタンスを実行します

このコピーは元の配列に対して行われる変更に影響されません。

ビュー:

インスタンス

ビューを作成し、元の配列を変更し、2つの配列を表示します:

import numpy as np
arr = np.array([1, 2, 3, 4, 5])
x = arr.view()
arr[0] = 61
print(arr) 
print(x)

インスタンスを実行します

ビューは元の配列に対して行われる変更に影響されます。

ビューで変更します:

インスタンス

ビューを作成し、ビューを変更し、2つの配列を表示します:

import numpy as np
arr = np.array([1, 2, 3, 4, 5])
x = arr.view()
x[0] = 31
print(arr) 
print(x)

インスタンスを実行します

元の配列はビューに対して行われる変更に影響されます。

配列がデータを持っているか確認します

上記のように、コピーはデータを持っていますが、ビューはデータを持っていません。では、どうやって確認しますか?

NumPy 配列には属性があります base、配列がデータを持っている場合、この base 属性は以下を返します None

そうでない場合、base 属性は元のオブジェクトを参照します。

インスタンス

配列が独自のデータを持っているか確認するために base 属性の値を印刷します:

import numpy as np
arr = np.array([1, 2, 3, 4, 5])
x = arr.copy()
y = arr.view()
print(x.base)
print(y.base)

インスタンスを実行します

コピーを返します None

ビューを元の配列に戻します。