对于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
True
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