NumPy 副本和视图

数组副本是内容与原数组相同,存储在另一个内存位置的数组。

数组视图是由原数组生成的另一个数组,但是与原数组共享数组元素内存,是对同一个内存位置所存储数组元素的不同呈现。

数组引用是原数组的别名,与原数组是同一个数组。

数组赋值

NumPy中,把一个数组赋值给另一个数组,不会拷贝数组,赋值只是对原始数组的引用。对被赋值数组做的更改也会反映在原始数组中。

id()函数返回数组的通用标识符,类似于C语言中的指针。

示例

import numpy as np  

a = np.array([[1,2,3,4],[9,0,2,3],[1,2,3,19]])  

print("原始数组:")
print(a)
print('\n')  

print("数组a的ID:", id(a))  

b = a   

print("\n赋值操作 b = a:")  

print("\nb的ID:",id(b))  

b.shape = 4,3;  

print("\nb上的修改也反映到a上:")  
print(a)  

输出

原始数组:
 [[ 1  2  3  4]
  [ 9  0  2  3]
  [ 1  2  3 19]]

数组a的ID: 140377691416656

赋值操作 b = a:

b的ID: 140377691416656

b上的修改也反映到a上:
[[ 1  2  3]
 [ 4  9  0]
 [ 2  3  1]
 [ 2  3 19]]

ndarray.view()

view()方法返回新的数组对象,但数组元素数据与原始数组共享,因此是浅拷贝。与前面的情况不同,新数组的维数更改不会影响原数组的维数。

示例

import numpy as np  

a = np.array([[1,2,3,4],[9,0,2,3],[1,2,3,19]])  

print("原始数组:\n",a)  

print("\na的ID:",id(a))  

b = a.view()  

print("\nb的ID:",id(b))  

print("\n打印b的view")  
print(b)  

b.shape = 4,3;  

print("\nb的维数更改不影响a")  
print("\n原始数组 \n",a)  
print("\nview\n",b)  


b[0, 0] = 100

print("\nb的元素更改会影响a")  
print("\n原始数组 \n",a)  
print("\nview\n",b)  

输出


原始数组: [[ 1 2 3 4] [ 9 0 2 3] [ 1 2 3 19]] a的ID: 140249104167360 b的ID: 140249103376752 打印b的view [[ 1 2 3 4] [ 9 0 2 3] [ 1 2 3 19]] b的维数更改不影响a 原始数组 [[ 1 2 3 4] [ 9 0 2 3] [ 1 2 3 19]] view [[ 1 2 3] [ 4 9 0] [ 2 3 1] [ 2 3 19]] b的元素更改会影响a 原始数组 [[100 2 3 4] [ 9 0 2 3] [ 1 2 3 19]] view [[100 2 3] [ 4 9 0] [ 2 3 1] [ 2 3 19]]

ndarray.copy()

copy()返回原始数组的深层副本,该副本不与原始数组共享任何内存,是深拷贝。对数组副本所做的修改不会影响原始数组。

示例

import numpy as np  

a = np.array([[1,2,3,4],[9,0,2,3],[1,2,3,19]])  

print("原始数组:\n", a)  

print("\na的ID:", id(a))  

b = a.copy()  

print("\nb的ID:", id(b))  

print("\n打印b")  
print(b)  

b.shape = 4,3;  

print("\nb的维数更改不影响a")  
print("\n原始数组a \n", a)  
print("\n数组副本b \n", b)  


b[0, 0] = 100

print("\nb的元素更改不影响a")  
print("\n原始数组a \n", a)  
print("\n数组副本b \n", b)  

输出

原始数组:
 [[ 1  2  3  4]
 [ 9  0  2  3]
 [ 1  2  3 19]]

a的ID: 140312719819200

b的ID: 140312509357872

打印b
[[ 1  2  3  4]
 [ 9  0  2  3]
 [ 1  2  3 19]]

b的维数更改不影响a

原始数组a
 [[ 1  2  3  4]
 [ 9  0  2  3]
 [ 1  2  3 19]]

数组副本b
 [[ 1  2  3]
 [ 4  9  0]
 [ 2  3  1]
 [ 2  3 19]]

b的元素更改不影响a

原始数组a
 [[ 1  2  3  4]
 [ 9  0  2  3]
 [ 1  2  3 19]]

数组副本b
 [[100   2   3]
 [  4   9   0]
 [  2   3   1]
 [  2   3  19]]




浙ICP备17015664号 浙公网安备 33011002012336号 联系我们 网站地图  
@2019 qikegu.com 版权所有,禁止转载