鍍金池/ 教程/ 數(shù)據(jù)分析&挖掘/ NumPy副本和視圖
NumPy位操作
NumPy數(shù)學(xué)算數(shù)函數(shù)
NumPy高級索引
NumPy環(huán)境安裝配置
NumPy IO文件操作
NumPy字符串函數(shù)
NumPy切片和索引
NumPy統(tǒng)計函數(shù)
NumPy矩陣庫
NumPy數(shù)組創(chuàng)建例程
NumPy線性代數(shù)
NumPy Matplotlib庫
NumPy教程
NumPy排序、搜索和計數(shù)函數(shù)
NumPy字節(jié)交換
NumPy Ndarray對象
NumPy數(shù)組操作
NumPy使用 Matplotlib 繪制直方圖
NumPy數(shù)組屬性
NumPy廣播
NumPy來自現(xiàn)有數(shù)據(jù)的數(shù)組
NumPy副本和視圖
NumPy在數(shù)組上的迭代
NumPy來自數(shù)值范圍的數(shù)組
NumPy算數(shù)運算
NumPy數(shù)據(jù)類型

NumPy副本和視圖

NumPy - 副本和視圖

在執(zhí)行函數(shù)時,其中一些返回輸入數(shù)組的副本,而另一些返回視圖。 當(dāng)內(nèi)容物理存儲在另一個位置時,稱為副本。 另一方面,如果提供了相同內(nèi)存內(nèi)容的不同視圖,我們將其稱為視圖

無復(fù)制

簡單的賦值不會創(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]]

視圖或淺復(fù)制

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]]

深復(fù)制

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]]