Python机器学习(四十七)NumPy 副本和视图

Posted 大码王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(
)  

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

b = a   

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

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

b.shape = 4,3;  

print("
b上的修改也反映到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("原始数组:
",a)  

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

b = a.view()  

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

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

b.shape = 4,3;  

print("
b的维数更改不影响a")  
print("
原始数组 
",a)  
print("
view
",b)  


b[0, 0] = 100

print("
b的元素更改会影响a")  
print("
原始数组 
",a)  
print("
view
",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("原始数组:
", a)  

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

b = a.copy()  

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

print("
打印b")  
print(b)  

b.shape = 4,3;  

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


b[0, 0] = 100

print("
b的元素更改不影响a")  
print("
原始数组a 
", a)  
print("
数组副本b 
", 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]]

 

以上是关于Python机器学习(四十七)NumPy 副本和视图的主要内容,如果未能解决你的问题,请参考以下文章

Python机器学习(四十八)NumPy 矩阵库函数

Python机器学习(四十四)NumPy 数学函数

Python机器学习(四十六)NumPy 排序查找计数

第四十七篇 入门机器学习——分类的准确性(Accuracy)

Python学习笔记(四十七)SMTP发送邮件

python学习第四十七天:浮动与定位