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

NumPy副本和視圖

NumPy - 副本和視圖

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

無復(fù)制

簡(jiǎn)單的賦值不會(huì)創(chuàng)建數(shù)組對(duì)象的副本。 相反,它使用原始數(shù)組的相同id()來訪問它。 id()返回 Python 對(duì)象的通用標(biāo)識(shí)符,類似于 C 中的指針。

此外,一個(gè)數(shù)組的任何變化都反映在另一個(gè)數(shù)組上。 例如,一個(gè)數(shù)組的形狀改變也會(huì)改變另一個(gè)數(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()方法,它是一個(gè)新的數(shù)組對(duì)象,并可查看原始數(shù)組的相同數(shù)據(jù)。 與前一種情況不同,新數(shù)組的維數(shù)更改不會(huì)更改原始數(shù)據(jù)的維數(shù)。

示例

import numpy as np 
# 最開始 a 是個(gè) 3X2 的數(shù)組
a = np.arange(6).reshape(3,2)  
print  '數(shù)組 a:'  
print a 
print  '創(chuàng)建 a 的視圖:' 
b = a.view()  
print b 
print  '兩個(gè)數(shù)組的 id() 不同:'  
print  'a 的 id():'  
print id(a)  
print  'b 的 id():'  
print id(b)  
# 修改 b 的形狀,并不會(huì)修改 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]]

兩個(gè)數(shù)組的 id() 不同:
a 的 id():
140424307227264
b 的 id():
140424151696288

b 的形狀:
[[0 1 2]
 [3 4 5]]

a 的形狀:
[[0 1]
 [2 3]
 [4 5]]

數(shù)組的切片也會(huì)創(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)建一個(gè)深層副本。 它是數(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]]