问题:Numpy的array()和asarray()函数有什么区别?
回答 0
由于将其他问题重定向到这个询问问题asanyarray
或其他数组创建例程的问题,因此可能有必要简要概述每个问题的作法。
区别主要在于何时返回不变的输入,而不是将新数组作为副本。
array
提供了多种选择(大多数其他功能都是围绕它的薄包装器),包括用于确定何时复制的标志。完整的解释将和文档一样长(请参阅Array Creation,但是简要地,这里有一些示例:
假设a
是ndarray
,并且m
是matrix
,并且它们都具有dtype
的float32
:
np.array(a)
并且np.array(m)
将复制两个,因为这是默认行为。np.array(a, copy=False)
并且np.array(m, copy=False)
将复制m
但不复制a
,因为m
不是ndarray
。np.array(a, copy=False, subok=True)
,并且np.array(m, copy=False, subok=True)
不会复制任何内容,因为m
是matrix
,这是的子类ndarray
。np.array(a, dtype=int, copy=False, subok=True)
将同时复制两者,因为与dtype
不兼容。
其他大多数功能都是array
在复制发生时围绕该控件的薄包装器:
:如果兼容 ndarray
(copy=False
),则输入将返回未复制的状态。:如果输入是兼容的 ndarray
或子类matrix
(如copy=False
,subok=True
),则输入将不被复制。:如果输入是兼容 ndarray
的连续C顺序(copy=False
,,则将返回未复制的输入order='C')
。:如果输入与 ndarray
连续的Fortran顺序(copy=False
,order='F'
)兼容,则将返回未复制的输入。require
:如果输入与指定的需求字符串兼容,则输入将不复制而返回。copy
:总是复制输入。:输入被视为可迭代的(例如,您可以从迭代器的元素构造数组,而不是 object
使用迭代器的数组);始终复制。
还有一些便利功能,例如asarray
,但复制规则与相同,但是ValueError
如果有nan
或inf
值,则会提高),以及子类的构造函数(例如matrix
或特殊情况下的记录数组),当然还有实际的ndarray
构造函数(可让您直接创建数组)超出缓冲区)。
回答 1
的定义asarray
是:
def asarray(a, dtype=None, order=None):
return array(a, dtype, copy=False, order=order)
就像array
,除了它的选项更少,和copy=False
。array
有copy=True
默认。
主要区别在于array
(默认情况下)将复制对象,而asarray
除非有必要,否则不会复制。
回答 2
可以通过以下示例证明差异:
产生矩阵
>>> A = numpy.matrix(numpy.ones((3,3))) >>> A matrix([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]])
用于
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(A)[2]=2 >>> A matrix([[ 1., 1., 1.], [ 1., 1., 1.], [ 2., 2., 2.]])
希望这可以帮助!
回答 3
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,则子类将被传递,否则返回的数组将被强制为基类数组(默认)。
ndmin:int,可选指定结果数组应具有的最小维数。可以根据需要预先添加形状。
回答 4
这是一个可以证明差异的简单示例。
主要区别在于数组将复制原始数据,并且使用不同的对象,我们可以修改原始数组中的数据。
import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)
数组(a)中的内容保持不变,但仍然可以使用另一个对象对数据执行任何操作,而无需修改原始数组中的内容。
回答 5
asarray(x)
就好像 array(x, copy=False)
asarray(x)
当您要确保x
在执行任何其他操作之前将其设为数组时使用。如果x
已经是数组,则不会进行任何复制。这不会造成冗余的性能损失。
这是确保x
首先转换为数组的函数示例。
def mysum(x):
return np.asarray(x).sum()