「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,有时候可以减少内存占用

相关文章

JavaScript数组的简单排序

JavaScript数组的简单排序前面的博客分两章分别讲解了数组对象的基本属性和方法,以及数组迭代方法的使用。今天我们再来讲一讲数组的排序问题。1.数组的sort()方法说到数组的排序,大家可能第一反...