当前位置: 首页 > 文档资料 > NumPy 中文教程 >

副本和视图(Copies & Views)

优质
小牛编辑
131浏览
2023-12-01

在执行函数时,其中一些函数返回输入数组的副本,而一些函数返回视图。 当内容物理存储在另一个位置时,称为Copy 。 另一方面,如果提供相同内存内容的不同视图,我们将其称为View

没有副本

简单赋值不会生成数组对象的副本。 相反,它使用原始数组的相同id()来访问它。 id()返回Python对象的通用标识符,类似于C中的指针。

此外,任何一方面的任何变化都会反映在另一方面。 例如,改变一个的形状也会改变另一个的形状。

例子 (Example)

import numpy as np 
a = np.arange(6) 
print 'Our array is:' 
print a  
print 'Applying id() function:' 
print id(a)  
print 'a is assigned to b:' 
b = a 
print b  
print 'b has same id():' 
print id(b)  
print 'Change shape of b:' 
b.shape = 3,2 
print b  
print 'Shape of a also gets changed:' 
print a

它将产生以下输出 -

Our array is:
[0 1 2 3 4 5]
Applying id() function:
139747815479536
a is assigned to b:
[0 1 2 3 4 5]
b has same id():
139747815479536
Change shape of b:
[[0 1]
 [2 3]
 [4 5]]
Shape of a also gets changed:
[[0 1]
 [2 3]
 [4 5]]

查看或浅拷贝

NumPy有ndarray.view()方法,它是一个新的数组对象,它查看原始数组的相同数据。 与前面的情况不同,新阵列的尺寸变化不会改变原始尺寸。

例子 (Example)

import numpy as np 
# To begin with, a is 3X2 array 
a = np.arange(6).reshape(3,2) 
print 'Array a:' 
print a  
print 'Create view of a:' 
b = a.view() 
print b  
print 'id() for both the arrays are different:' 
print 'id() of a:'
print id(a)  
print 'id() of b:' 
print id(b)  
# Change the shape of b. It does not change the shape of a 
b.shape = 2,3 
print 'Shape of b:' 
print b  
print 'Shape of a:' 
print a

它将产生以下输出 -

Array a:
[[0 1]
 [2 3]
 [4 5]]
Create view of a:
[[0 1]
 [2 3]
 [4 5]]
id() for both the arrays are different:
id() of a:
140424307227264
id() of b:
140424151696288
Shape of b:
[[0 1 2]
 [3 4 5]]
Shape of a:
[[0 1]
 [2 3]
 [4 5]]

切片的数组创建一个视图。

例子 (Example)

import numpy as np 
a = np.array([[10,10], [2,3], [4,5]]) 
print 'Our array is:' 
print a  
print 'Create a slice:' 
s = a[:, :2] 
print s 

它将产生以下输出 -

Our array is:
[[10 10]
 [ 2 3]
 [ 4 5]]
Create a slice:
[[10 10]
 [ 2 3]
 [ 4 5]]

深拷贝

ndarray.copy()函数创建一个深层副本。 它是数组及其数据的完整副本,不与原始数组共享。

例子 (Example)

import numpy as np 
a = np.array([[10,10], [2,3], [4,5]]) 
print 'Array a is:' 
print a  
print 'Create a deep copy of a:' 
b = a.copy() 
print 'Array b is:' 
print b 
#b does not share any memory of a 
print 'Can we write b is a' 
print b is a  
print 'Change the contents of b:' 
b[0,0] = 100 
print 'Modified array b:' 
print b  
print 'a remains unchanged:' 
print a

它将产生以下输出 -

Array a is:
[[10 10]
 [ 2 3]
 [ 4 5]]
Create a deep copy of a:
Array b is:
[[10 10]
 [ 2 3]
 [ 4 5]]
Can we write b is a
False
Change the contents of b:
Modified array b:
[[100 10]
 [ 2 3]
 [ 4 5]]
a remains unchanged:
[[10 10]
 [ 2 3]
 [ 4 5]]