与numpy有关的别名,深层副本,浅层副本之间的区别

时间:2018-12-18 22:20:20

标签: python-3.x numpy deep-copy shallow-copy

"0"

我了解C,C ++中的浅表复制和深表复制,但是python中发生了什么?

查看c ++代码。会发生同样的事情吗?

from numpy import *
arr1=array([1,2,3])
arr2=arr1 #aliasing
arr3=arr1.view() #shallow copy
arr4=arr1.copy() #deep copy
id(arr1) #120638624
id(arr2) #120638624
id(arr3) #120639004
id(arr4) #123894390

1 个答案:

答案 0 :(得分:0)

您具有别名和深层复制权限(尽管通常不认为在for循环中复制数组值是一种好方法)。

另一方面,数字view不是指针。这是一件重得多的事情,它本身就是一个适当的对象实例。从概念上讲,它与Python中存在的实际指针数组最接近(尽管语义当然有所不同),并且可以在代码中扮演某些相同的角色。一个视图永远不会像原始指针那样具有出色的性能,因为该视图需要携带一组数据,例如形状和步幅,这些数据可能与其“父”数组的数据不同。

另一方面,Numpy数组和视图都包装__array_interface__,而typings.get_type_hints则包装指向保存实际数据的基础缓冲区的指针。因此,当您对数组进行新的视图时,您确实要对基础数据进行适当的浅表复制,因为您要复制指向该数据的指针(尽管要经过多层包装和间接访问)。