用过numpy包的人可能会发现,np.array和np.asarray都可以将数据结构转化为矩阵的形式。笔者在阅读一些技术类书籍的时候也发现,有的作者不加区分地在代码中随意使用二者,给读者造成了很大的困扰。那么这篇文章里,我们就来谈一谈np.array和np.asarry的区别。

节省时间,先直接看结论

np.array和np.asarray都可以将数据结构转化为ndarray的形式,这一点没有问题。但是主要区别在于:当数据源是ndarray形式时候,array会生成一个副本,占用新的内存,而asarray不会。

例子:

1. 当数据源为非ndarray时

import numpy as np
a = [[1,2],[3,4]]
b = np.array(a)
c = np.asarray(a)
a[1] = 0
print(a)
print(b)
print(c)

查看结果:

图1. 输入源为非ndarray的结果

可见,当输入源不是ndarray的时候,array和asarray的作用一样,都是将输入转化为矩阵的形式,并且更改输入源的值并不会影响转化矩阵的值。查看一下a,b,c三个对象在内存中的id,

图2. id情况1

我们发现,a,b,c的id各不相同,说明当输入源为非ndarray时(例子中为list),使用np.array和np.asarray均会创建输入源的副本,对a进行修改并不会影响b和c。

2. 当数据源为ndarray时

import numpy as np
a = np.asarray([[1,2],[3,4]])
b = np.array(a)
c = np.asarray(a)
a[1] = 0
print(a)
print(b)
print(c)

查看结果:

图3. 输入源为ndarray时的结果

可见,当输入源为ndarray时,np.array会创建一个新的副本,因此对输入源进行修改不会影响转化的矩阵;而np.asarray不会创建一个新的副本,则其转化的矩阵会随着输入源的改变而改变。查看一下a,b,c三个对象在内存中的id,


图4. id情况2

我们发现,a和c的id编号相同,说明二者指向同一个对象,因此修改了a也就相当于修改了c;而b的id与二者不同,说明其新建了一个副本,对a进行修改并不会影响b。

参考:

https://www.jianshu.com/p/a050fecd5a29
https://blog.csdn.net/xiaomifanhxx/article/details/82498176