Numpy - 阵列vs asarray

时间:2013-01-19 15:18:47

标签: python arrays numpy

Numpy的array()asarray()功能有什么区别?你什么时候应该使用一个而不是另一个?它们似乎为我能想到的所有输入产生相同的输出。

6 个答案:

答案 0 :(得分:202)

definition of asarray是:

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

所以它就像array,除了它有更少的选项,copy=False。默认情况下,arraycopy=True

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

答案 1 :(得分:94)

这个例子可以证明这种差异:

  1. 生成矩阵

    >>> A = numpy.matrix(np.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.]])
    
  4. 希望这有帮助!

答案 2 :(得分:39)

由于其他问题被重定向到询问asanyarrayother array creation routines的问题,因此可能有必要简要概述每个问题。

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

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

假设andarray,而mmatrix,并且它们的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)都不会复制,因为mmatrix的{​​{1}},它是ndarray的子类。
  • np.array(a, dtype=int, copy=False, subok=True)将同时复制两者,因为dtype不兼容。

大多数其他功能是array周围的薄包装器,用于控制何时进行复制:

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

还有便利功能,例如asarray_chkfinite(复制规则与asarray相同,但是如果存在任何ValueErrornan值,则会引发inf) ,以及子类(如matrix或特殊情况(如记录数组)的构造函数,当然还有实际的ndarray构造函数(可让您直接跨缓冲区创建数组)。

答案 3 :(得分:12)

arrayasarray的文档中非常清楚地提到了这些差异。不同之处在于参数列表,因此函数的操作取决于这些参数。

功能定义是:

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)中的内容保持不变,但是,我们仍然可以使用另一个对象对数据执行任何操作,而无需修改原始数组中的内容。