在執(zhí)行函數(shù)時,其中一些返回輸入數(shù)組的副本,而另一些返回視圖。 當(dāng)內(nèi)容物理存儲在另一個位置時,稱為副本。 另一方面,如果提供了相同內(nèi)存內(nèi)容的不同視圖,我們將其稱為視圖。
簡單的賦值不會創(chuàng)建數(shù)組對象的副本。 相反,它使用原始數(shù)組的相同id()
來訪問它。 id()
返回 Python 對象的通用標(biāo)識符,類似于 C 中的指針。
此外,一個數(shù)組的任何變化都反映在另一個數(shù)組上。 例如,一個數(shù)組的形狀改變也會改變另一個數(shù)組的形狀。
import numpy as np
a = np.arange(6)
print '我們的數(shù)組是:'
print a
print '調(diào)用 id() 函數(shù):'
print id(a)
print 'a 賦值給 b:'
b = a
print b
print 'b 擁有相同 id():'
print id(b)
print '修改 b 的形狀:'
b.shape = 3,2
print b
print 'a 的形狀也修改了:'
print a
輸出如下:
我們的數(shù)組是:
[0 1 2 3 4 5]
調(diào)用 id() 函數(shù):
139747815479536
a 賦值給 b:
[0 1 2 3 4 5]
b 擁有相同 id():
139747815479536
修改 b 的形狀:
[[0 1]
[2 3]
[4 5]]
a 的形狀也修改了:
[[0 1]
[2 3]
[4 5]]
NumPy 擁有ndarray.view()
方法,它是一個新的數(shù)組對象,并可查看原始數(shù)組的相同數(shù)據(jù)。 與前一種情況不同,新數(shù)組的維數(shù)更改不會更改原始數(shù)據(jù)的維數(shù)。
import numpy as np
# 最開始 a 是個 3X2 的數(shù)組
a = np.arange(6).reshape(3,2)
print '數(shù)組 a:'
print a
print '創(chuàng)建 a 的視圖:'
b = a.view()
print b
print '兩個數(shù)組的 id() 不同:'
print 'a 的 id():'
print id(a)
print 'b 的 id():'
print id(b)
# 修改 b 的形狀,并不會修改 a
b.shape = 2,3
print 'b 的形狀:'
print b
print 'a 的形狀:'
print a
輸出如下:
數(shù)組 a:
[[0 1]
[2 3]
[4 5]]
創(chuàng)建 a 的視圖:
[[0 1]
[2 3]
[4 5]]
兩個數(shù)組的 id() 不同:
a 的 id():
140424307227264
b 的 id():
140424151696288
b 的形狀:
[[0 1 2]
[3 4 5]]
a 的形狀:
[[0 1]
[2 3]
[4 5]]
數(shù)組的切片也會創(chuàng)建視圖:
import numpy as np
a = np.array([[10,10], [2,3], [4,5]])
print '我們的數(shù)組:'
print a
print '創(chuàng)建切片:'
s = a[:, :2]
print s
輸出如下:
我們的數(shù)組:
[[10 10]
[ 2 3]
[ 4 5]]
創(chuàng)建切片:
[[10 10]
[ 2 3]
[ 4 5]]
ndarray.copy()
函數(shù)創(chuàng)建一個深層副本。 它是數(shù)組及其數(shù)據(jù)的完整副本,不與原始數(shù)組共享。
import numpy as np
a = np.array([[10,10], [2,3], [4,5]])
print '數(shù)組 a:'
print a
print '創(chuàng)建 a 的深層副本:'
b = a.copy()
print '數(shù)組 b:'
print b
# b 與 a 不共享任何內(nèi)容
print '我們能夠?qū)懭?b 來寫入 a 嗎?'
print b is a
print '修改 b 的內(nèi)容:'
b[0,0] = 100
print '修改后的數(shù)組 b:'
print b
print 'a 保持不變:'
print a
輸出如下:
數(shù)組 a:
[[10 10]
[ 2 3]
[ 4 5]]
創(chuàng)建 a 的深層副本:
數(shù)組 b:
[[10 10]
[ 2 3]
[ 4 5]]
我們能夠?qū)懭?b 來寫入 a 嗎?
False
修改 b 的內(nèi)容:
修改后的數(shù)組 b:
[[100 10]
[ 2 3]
[ 4 5]]
a 保持不變:
[[10 10]
[ 2 3]
[ 4 5]]