array和asarray都可以将结构数据转化为ndarray,但是主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会。
1.输入为列表时,即被转换的原始数据类型为列表时
import numpy as np
a=[[1,2,3],[4,5,6],[7,8,9]]
b = np.array(a)
c = np.asarray(a)
a[1] = 1
print(a) # [[1, 2, 3], 1, [7, 8, 9]]
print(b)
'''
[[1 2 3]
[4 5 6]
[7 8 9]]
'''
print(c)
'''
[[1 2 3]
[4 5 6]
[7 8 9]]
'''
从中我们可以看出np.array与np.asarray功能是一样的,都是将输入转为矩阵格式。当输入是列表的时候,更改列表的值并不会影响转化为矩阵的值。
2.输入为数组时
import numpy as np
a=np.random.random((3,3))
print(a.dtype) # float64
b=np.array(a,dtype='float64')
c=np.asarray(a,dtype='float64')
a[1]=2
print(a)
'''
[[0.31327972 0.33505141 0.63028714]
[2. 2. 2. ]
[0.84950484 0.27039307 0.80752204]]
'''
print(b)
'''
[[0.31327972 0.33505141 0.63028714]
[0.15328483 0.38864211 0.71189085]
[0.84950484 0.27039307 0.80752204]]
'''
print(c)
'''
[[0.31327972 0.33505141 0.63028714]
[2. 2. 2. ]
[0.84950484 0.27039307 0.80752204]]
'''
print(b is a) # False
print(c is a) # True
从上述结果我们可以看出np.array与np.asarray的区别。其在于输入为数组时,np.array是将重新创建一个数组空间并将数据复制进去,它有自己的一块内存区域,所以随着输入的改变np.array的输出不变;而np.asarray功能是将指向数组a的计数器加1,并指向该数组,这样当原始数组改变的时候,np.asarray的输出也会改变。