「python」np.array()和np.asarray()的区别
NumPy函数库是Python开发环境的一个独立模块,是Python的一个开源的数值计算扩展工具。在使用NumPy库之前,必须首先导入该函数库,导入方式为import numpy as np.
其中array和asarray都可以将结构数据转化为ndarray,两者的主要区别在于 np.array (默认情况下)会copy该对象,而 np.asarray一般不会copy该对象(除非必要)。
【源码定义】
- np.array 的定义:
def array(a, dtype=None, order=None):
return array(a, dtype, copy=True, order=order)
- np.asarray 的定义:
def asarray(a, dtype=None, order=None):
return array(a, dtype, copy=False, order=order)
从源码定义,可以看出np.array进行了复制,而np.asarray对darray数据类型不进行复制。
【举例说明】
- #example 1:输入都为列表
import numpy as np
data1=[[1,1,1],[1,1,1],[1,1,1]]
arr2=np.array(data1)
arr3=np.asarray(data1)
data1[1][1]=2
print 'data1:\n',data1
print 'arr2:\n',arr2
print 'arr3:\n',arr3
输出:
data1: [[1, 1, 1], [1, 2, 1], [1, 1, 1]]
arr2:
[[1 1 1]
[1 1 1]
[1 1 1]]
arr3:
[[1 1 1]
[1 1 1]
[1 1 1]]
可见array和asarray没有区别,都对元数据进行了复制。
- #example 2:输入都为ndarray
import numpy as np
arr1=np.ones((3,3))
arr2=np.array(arr1)
arr3=np.asarray(arr1)
arr1[1]=2
print 'arr1:\n',arr1
print 'arr2:\n',arr2
print 'arr3:\n',arr3
输出:
arr1:
[[ 1. 1. 1.]
[ 2. 2. 2.]
[ 1. 1. 1.]]
arr2:
[[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]]
arr3:
[[ 1. 1. 1.]
[ 2. 2. 2.]
[ 1. 1. 1.]]
此时两者才表现出区别。修改了arr1,arr3也会跟着改变。
【注意】如果在np.asarray时改变数据类型,也会进行重新复制。
import numpy as np
arr7 = np.ones((3,3))
print("dtype of arr7:",arr7.dtype)
arr8 = np.asarray(arr7,dtype = np.int8)
print("dtype of arr8:",arr8.dtype)
print("arr7:\n",arr7)
print("arr8:\n",arr8)
print(arr7 is arr8)
结果:
import numpy as np
dtype of arr7: float64
dtype of arr8: int8
arr7:
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
arr8:
[[1 1 1]
[1 1 1]
[1 1 1]]
False
【总结】
np.asarray只对numpy的内部数据类型ndarray有用,而且仅在只改变数据数值时不会重新赋值。建议赋值数据时用np.asarray,有时候可以减少内存占用。