NumPy的np.array和np.asarray之间有什么区别?什么时候我应该使用其中一种而不是另一种?它们似乎产生了相同的输出。
np.array
np.asarray
asarray的定义是:
asarray
def asarray(a, dtype=None, order=None): return array(a, dtype, copy=False, order=order)
所以它就像array,除了它有更少的选项,和copy=False。array默认有copy=True。
array
copy=False
copy=True
主要的区别是array(默认)将创建对象的副本,而asarray除非必要,否则不会。
在array和asarray的文档中清楚地提到了这些区别。区别在于参数列表,因此函数的操作取决于这些形参。
函数定义如下:
numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
而且
numpy.asarray(a, dtype=None, order=None)
以下参数是文档中提到的可以传递给array和不 asarray的参数:
copy: bool,可选如果为true(默认值),则复制对象。 否则,只有当__array__返回一个副本时,才会创建一个副本 Obj是一个嵌套序列,或者如果需要一个副本来满足任意 其他要求(dtype, order等) subok: bool,可选如果为True,则子类将为 传递,否则返回的数组将被强制为a 基类数组(默认). ndmin: int, optional指定最小维度数 结果数组应该有。一个将预先挂在形状 . . .
copy: bool,可选如果为true(默认值),则复制对象。 否则,只有当__array__返回一个副本时,才会创建一个副本 Obj是一个嵌套序列,或者如果需要一个副本来满足任意 其他要求(dtype, order等)
__array__
subok: bool,可选如果为True,则子类将为 传递,否则返回的数组将被强制为a 基类数组(默认).
ndmin: int, optional指定最小维度数 结果数组应该有。一个将预先挂在形状
这种差异可以通过下面的例子来证明:
生成矩阵。
>>> A = numpy.matrix(numpy.ones((3, 3))) >>> A matrix([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]])
使用numpy.array修改A。无法工作,因为您正在修改副本。
numpy.array
A
>>> numpy.array(A)[2] = 2 >>> A matrix([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]])
使用numpy.asarray修改A。它能工作是因为你正在修改A本身。
numpy.asarray
>>> numpy.asarray(A)[2] = 2 >>> A matrix([[ 1., 1., 1.], [ 1., 1., 1.], [ 2., 2., 2.]])
这里有一个简单的例子可以说明这种区别。
主要区别是数组会复制原始数据,而使用不同的对象我们可以修改原始数组中的数据。
import numpy as np a = np.arange(0.0, 10.2, 0.12) int_cvr = np.asarray(a, dtype = np.int64)
数组(a)中的内容保持不变,并且仍然可以使用另一个对象对数据执行任何操作,而无需修改原始数组中的内容。
由于其他问题都被重定向到这个问题,即asanyarray或其他数组创建例程,因此可能有必要对它们各自的功能进行简要总结。
asanyarray
区别主要在于什么时候不加改动地返回输入,而不是创建一个新数组作为副本。
array提供了各种各样的选项(大多数其他函数都是围绕它的薄包装器),包括确定何时复制的标志。一个完整的解释将需要和文档一样长的时间(参见创建数组,但简单地,这里有一些例子:
假设a是ndarray, m是matrix,它们的dtype都是float32:
a
ndarray
m
matrix
dtype
float32
np.array(a)
np.array(m)
np.array(a, copy=False)
np.array(m, copy=False)
np.array(a, copy=False, subok=True)
np.array(m, copy=False, subok=True)
np.array(a, dtype=int, copy=False, subok=True)
大多数其他函数都是array的薄包装器,用于控制复制发生的时间:
subok=True
ascontiguousarray
order='C')
asfortranarray
order='F'
require
copy
fromiter
object
还有一些方便的函数,比如asarray_chkfinite(与asarray相同的复制规则,但如果有任何nan或inf值,则会引发ValueError),还有子类的构造函数,比如matrix或记录数组等特殊情况,当然还有实际的ndarray构造函数(它允许你直接在缓冲区上跨步创建数组)。
asarray_chkfinite
nan
inf
ValueError
asarray(x)类似于array(x, copy=False)
asarray(x)
array(x, copy=False)
当你想确保x在任何其他操作完成之前是一个数组时,使用asarray(x)。如果x已经是一个数组,则不会进行复制。它不会导致冗余的性能损失。
x
下面是一个确保x首先转换为数组的函数示例。
def mysum(x): return np.asarray(x).sum()
np.array()
np.asarray()
#Create an array... arr = np.ones(5); # array([1., 1., 1., 1., 1.])
#Now I want to modify `arr` with `array` method. Let's see... arr = np.array(arr)[3] = 200; # array([1., 1., 1., 1., 1.])
数组没有变化,因为我们修改了arr的副本。
arr
现在,用asarray()方法修改arr。
asarray()
arr = np.asarray(arr)[3] = 200; # array([1., 200, 1., 1., 1.])
这个数组发生了变化,因为我们现在使用的是原始数组。