Python机器学习(四十七)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()返回原始数组的深层副本,该副本不与原始数组共享任何内存,是深拷贝。对数组副本所做的修改不会影响原始数组。

扫描二维码关注公众号,回复: 11317028 查看本文章

示例

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

猜你喜欢

转载自www.cnblogs.com/huanghanyu/p/13162056.html
今日推荐