390

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

4

6 回答 6

281

定义asarray是:

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

所以它就像array,除了它有更少的选项,并且copy=Falsearray默认有copy=True

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

于 2013-01-19T15:25:04.887 回答
190

由于其他问题被重定向到这个询问asanyarray其他数组创建例程的问题,因此可能值得简要总结一下它们的作用。

不同之处主要在于何时将输入原样返回,而不是创建一个新数组作为副本。

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)不会复制,因为m是 a matrix,它是 的子类ndarray
  • np.array(a, dtype=int, copy=False, subok=True)将复制两者,因为dtype不兼容。

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

  • asarrayndarray: 如果输入是兼容的( copy=False) ,则输入将返回未复制的内容。
  • asanyarray: 如果输入是兼容的ndarray或子类,如matrix( copy=False, subok=True),则输入将未复制返回。
  • ascontiguousarray: 如果输入ndarray在连续 C 顺序 ( copy=False, order='C').
  • asfortranarrayndarray: 如果输入在连续的 Fortran 顺序 ( copy=False, order='F')中兼容,则输入将未复制返回。
  • require:如果输入与指定的要求字符串兼容,则输入将未复制返回。
  • copy: 输入总是被复制。
  • fromiter:输入被视为可迭代的(例如,您可以从迭代器的元素构造一个数组,而不是使用object迭代器的数组);总是被复制。

还有一些便利函数,比如asarray_chkfinite(与超出缓冲区)。asarrayValueErrornaninfmatrixndarray

于 2018-08-30T19:06:29.393 回答
139

这个例子可以证明差异:

  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.]])
    

希望这可以帮助!

于 2016-12-08T01:23:42.600 回答
14

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, optional如果为真(默认),则对象被复制。否则,只有在__array__返回副本、obj 是嵌套序列或需要副本来满足任何其他要求(dtype、顺序等)时才会生成副本。

subok : bool, optional如果为True,则子类将被传递,否则返回的数组将被强制为基类数组(默认)。

ndmin : int, optional 指定结果数组应具有的最小维数。将根据需要预先添加到形状以满足此要求。

于 2013-01-19T15:25:33.107 回答
3

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

当您希望在完成任何其他操作之前asarray(x)确保它是一个数组时使用。x如果x已经是一个数组,则不会进行任何复制。它不会导致多余的性能损失。

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

def mysum(x):
    return np.asarray(x).sum()
于 2020-05-30T12:27:48.410 回答
0

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

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

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

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

于 2018-07-11T21:01:34.497 回答