对于C++来说,深拷贝与浅拷贝 的概念非常明确。但是,对于python的numpy 来说,深拷贝与浅拷贝比较难理解。因此,当Python传指针给C++时,很容易出现局部变量的指针提前释放产生的Bug。

  • array和asarray都可以将结构数据转化为ndarray
  • np.array 会copy出一个副本,占用新的内存,属于深拷贝
  • np.asarray 当 dtype 相同时,指针指向的内存相同,属于浅拷贝。
  • np.asarray 当 dtype 不同时,使用深拷贝。

代码验证如下:

import numpy as np
list_1 = [1, 2, 3, 4]
np_data_1 = np.array(list_1, dtype=np.float32)
# np.array 会copy出一个副本,占用新的内存,属于深拷贝
np_data_2 = np.array(np_data_1, dtype=np.double)
print(np_data_2 is np_data_1)
# np.asarray  当 dtype 相同时,指针指向的内存相同,没有拷贝
np_data_3 = np.asarray(np_data_1, dtype=np.float32)
print(np_data_3 is np_data_1)
# np.asarray  当 dtype 不同时,使用深拷贝。
np_data_4 = np.asarray(np_data_1, dtype=np.double)
print(np_data_4 is np_data_1)
False
False

引用的官方文档地址:
https://numpy.org/doc/stable/reference/generated/numpy.asarray.html :

outndarray Array interpretation of a. No copy is performed if the input is already an ndarray with matching dtype and order. If a is a subclass of ndarray, a base class ndarray is returned.
当类型与 order dtype 相同时,没有拷贝。 当不同时,会有拷贝。

这个文档也可以佐证:1.15 版本:https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.asarray.html

对于C++来说,深拷贝与浅拷贝 的概念非常明确。但是,对于python的numpy 来说,深拷贝与浅拷贝比较难理解。因此,当Python传指针给C++时,很容易出现局部变量的指针提前释放产生的Bug。array和asarray都可以将结构数据转化为ndarraynp.array 会copy出一个副本,占用新的内存,属于深拷贝np.asarray 当 dtype 相同时,指针指向的内存相同,属于浅拷贝。np.asarray 当 dtype 不同时,使用深拷贝。代码验证如下:import python变量名相当于标签名 list2 = list1, 直接赋值,实质上指向的是同一个内存值。任意一个变量(list1 or list2)发生改变,都会影响另外一个。 >>> list1=[1,2,3,4,5,6] >>> list2=list1 >>> list1[2]=88 >>> list1
numpy 深拷贝浅拷贝和视图总结和例子 ndarray类的索引和切片方法 组切片得到的是原始数组的视图,所有修改都会直接反映到源数组。如果需要得到的ndarray 切片的一份副本,需要进行复制操作 arange[5:8].copy() Python的列表序列不同,通过下标范围获取的新的数组是原始数组的一个视图。它与原始数组共享同一块数据空间. import numpy as np a=np.arange(10) array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、内插、外推等。因此,当涉及到数学任务时,它形成了一种基于 Python 的 MATLAB 的快速替代。 计算机的图像表示为多维数字数组。NumPy 提供了一些优秀的库函数来快速处理图像。例如,镜像图像、按特定角度旋转图像等。 在编写机器学习算法时,需要对矩阵进行各种数值