NumPy 數組副本 vs 視圖

副本和視圖之間的區別

副本和數組視圖之間的主要區別在于副本是一個新數組,而這個視圖只是原始數組的視圖。

副本擁有數據,對副本所做的任何更改都不會影響原始數組,對原始數組所做的任何更改也不會影響副本。

視圖不擁有數據,對視圖所做的任何更改都會影響原始數組,而對原始數組所做的任何更改都會影響視圖。

副本:

實例

進行復制,更改原始數組并顯示兩個數組:

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

運行實例

該副本不應受到對原始數組所做更改的影響。

視圖:

實例

創建視圖,更改原始數組,然后顯示兩個數組:

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

運行實例

視圖應該受到對原始數組所做更改的影響。

在視圖中進行更改:

實例

創建視圖,更改視圖,并顯示兩個數組:

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

視圖返回原始數組。