答案 0 :(得分:202)
def asarray(a, dtype=None, order=None):
return array(a, dtype, copy=False, order=order)
所以它就像array
,除了它有更少的选项,copy=False
。默认情况下,array
有copy=True
。
主要区别在于array
(默认情况下)会复制对象,而asarray
除非必要,否则不会。{/ p>
答案 1 :(得分:94)
这个例子可以证明这种差异:
生成矩阵
>>> A = numpy.matrix(np.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.]])
希望这有帮助!
答案 2 :(得分:39)
由于其他问题被重定向到询问asanyarray
或other array creation routines的问题,因此可能有必要简要概述每个问题。
区别主要在于何时返回不变的输入,而不是将新数组作为副本。
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
的{{1}},它是ndarray
的子类。np.array(a, dtype=int, copy=False, subok=True)
将同时复制两者,因为dtype
不兼容。大多数其他功能是array
周围的薄包装器,用于控制何时进行复制:
asarray
:如果输入是兼容的ndarray
(copy=False
),则输入将不被复制。asanyarray
:如果输入是兼容的ndarray
或类似matrix
(copy=False
,subok=True
)的子类,则输入将不被复制。ascontiguousarray
:如果输入是兼容的ndarray
且连续C顺序(copy=False
,order='C')
。asfortranarray
:如果输入是兼容的ndarray
(以连续的Fortran顺序(copy=False
,order='F'
)兼容,则将返回未复制的输入。require
:如果输入与指定的需求字符串兼容,则输入将不复制而返回。copy
:总是复制输入。fromiter
:输入被视为可迭代的(例如,您可以根据迭代器的元素构造一个数组,而不是使用迭代器的object
数组);始终复制。还有便利功能,例如asarray_chkfinite
(复制规则与asarray
相同,但是如果存在任何ValueError
或nan
值,则会引发inf
) ,以及子类(如matrix
或特殊情况(如记录数组)的构造函数,当然还有实际的ndarray
构造函数(可让您直接跨缓冲区创建数组)。
答案 3 :(得分:12)
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,optional指定最小维数 结果数组应该有。其中一个将预先形成 根据需要满足这一要求。
答案 4 :(得分:1)
asarray(x)
就像array(x, copy=False)
要确保在进行任何其他操作之前,asarray(x)
将是一个数组,请使用x
。如果x
已经是一个数组,则不会进行任何复制。不会造成多余的性能损失。
这是一个确保首先将x
转换为数组的函数的示例。
def mysum(x):
return np.asarray(x).sum()
答案 5 :(得分:0)
这是一个简单的例子,可以证明两者之间的区别。
主要区别在于数组将复制原始数据,并且使用不同的对象,我们可以修改原始数组中的数据。
import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)
数组(a)中的内容保持不变,但是,我们仍然可以使用另一个对象对数据执行任何操作,而无需修改原始数组中的内容。