Numpy的array()和asarray()函数有什么区别?


Answers:


110

由于将其他问题重定向到这个询问问题asanyarray其他数组创建例程的问题,因此可能有必要简要概述每个问题的作法。

区别主要在于何时返回不变的输入,而不是将新数组作为副本。

array提供了多种选择(大多数其他功能都是围绕它的薄包装器),包括用于确定何时复制的标志。完整的解释将和文档一样长(请参阅Array Creation,但是简要地,这里有一些示例:

假设andarray,并且mmatrix,并且它们都具有dtypefloat32

  • 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)不会复制任何内容,因为mmatrix,这是的子类ndarray
  • np.array(a, dtype=int, copy=False, subok=True)将同时复制两者,因为与dtype不兼容。

其他大多数功能都是array在复制发生时围绕该控件的薄包装器:

  • asarray:如果兼容ndarraycopy=False),则输入将返回未复制的状态。
  • asanyarray:如果输入是兼容的ndarray或子类matrix(如copy=Falsesubok=True),则输入将不被复制。
  • ascontiguousarray:如果输入是兼容ndarray的连续C顺序(copy=False,,则将返回未复制的输入order='C')
  • asfortranarray:如果输入与ndarray连续的Fortran顺序(copy=Falseorder='F')兼容,则将返回未复制的输入。
  • require:如果输入与指定的需求字符串兼容,则输入将不复制而返回。
  • copy:总是复制输入。
  • fromiter:输入被视为可迭代的(例如,您可以从迭代器的元素构造数组,而不是object使用迭代器的数组);始终复制。

还有一些便利功能,例如asarray_chkfinite(与复制规则相同asarray,但复制规则与相同,但是ValueError如果有naninf值,则会提高),以及子类的构造函数(例如matrix或特殊情况下的记录数组),当然还有实际的ndarray构造函数(可让您直接创建数组)超出缓冲区)。


谢谢您,它非常有帮助
Kris

234

定义asarray是:

def asarray(a, dtype=None, order=None):
    return array(a, dtype, copy=False, order=order)

就像array,除了它的选项更少,和copy=Falsearraycopy=True默认。

主要区别在于array(默认情况下)将复制对象,而asarray除非有必要,否则不会复制。


13
那么我们什么时候应该使用它们呢?如果从头开始创建一个数组,这是更好的,array([1, 2, 3])还是asarray([1, 2, 3])
endlith 2014年

15
@endolith:[1, 2, 3]是Python列表,因此必须创建数据的副本才能创建ndarary。因此,np.array直接使用代替np.asarraycopy=False参数发送到np.array。该copy=False如果一个副本必须做,因为这将是在这种情况下被忽略。如果您%timeit在IPython中使用这两种方法进行基准测试,您会发现小列表有所不同,但大列表几乎没有关系。
unutbu 2014年

3
对于方法名称而言,这也很有意义:“ asarray”:将其视为数组(就地),即,您只是在更改此列表/数组上的视图。“数组”:实际上将其转换为新数组。
denvar,2016年

1
怎么样np.asanyarray
李李

3
@Lee:asarray始终返回ndarrayasanyarray将返回ndarrayif 的子类。例如,an np.matrix是的子类ndarray。因此,np.asanyarray(np.matrix(...))返回相同的矩阵,而np.asarray(np.matrix(...))将矩阵转换为ndarray
unutbu '16

113

可以通过以下示例证明差异:

  1. 产生矩阵

    >>> A = numpy.matrix(numpy.ones((3,3)))
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  2. 用于numpy.array修改A。不起作用,因为您正在修改副本

    >>> numpy.array(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  3. 用于numpy.asarray修改A。之所以有效,是因为您正在修改A自己

    >>> numpy.asarray(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 2.,  2.,  2.]])

希望这可以帮助!


13

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,可选指定结果数组应具有的最小维数。可以根据需要预先添加形状。


1

这是一个可以证明差异的简单示例。

主要区别在于数组将复制原始数据,并且使用不同的对象,我们可以修改原始数组中的数据。

import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)

数组(a)中的内容保持不变,但仍然可以使用另一个对象对数据执行任何操作,而无需修改原始数组中的内容。


0

asarray(x) 就好像 array(x, copy=False)

asarray(x)当您要确保x在执行任何其他操作之前将其设为数组时使用。如果x已经是数组,则不会进行任何复制。这不会造成冗余的性能损失。

这是确保x首先转换为数组的函数示例。

def mysum(x):
    return np.asarray(x).sum()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.