Numpy - 阵列vs asarray

Ben*_*son 255 python arrays numpy

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

unu*_*tbu 216

的定义asarray为:

def asarray(a, dtype=None, order=None):
    return array(a, dtype, copy=False, order=order)
Run Code Online (Sandbox Code Playgroud)

所以它就像array,除了它有更少的选项,和copy=False.arraycopy=True默认.

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

  • @endolith:`[1,2,3]`是一个Python列表,因此必须创建数据的副本以创建`ndarary`.因此,直接使用`np.array`代替`np.asarray`,它会将`copy = False`参数发送到`np.array`.如果必须像在这种情况下那样复制,则忽略`copy = False`.如果你在IPython中使用'%timeit`对两者进行基准测试,你会看到小列表的区别,但是对于大型列表而言,它几乎不重要. (13认同)
  • 那我们应该什么时候使用?如果从头创建一个数组,哪个更好,`array([1,2,3])`或`asarray([1,2,3])`? (11认同)
  • 这对于方法名称也是有意义的:"asarray":将其视为一个数组(inplace),即你只是改变你对这个列表/数组的看法."array":实际上将其转换为新数组. (2认同)
  • “np.asanyarray”怎么样? (2认同)
  • @Lee:`asarray`总是返回一个`ndarray`.`asanyarray`将返回`ndarray`的子类,如果它是传递给它的那个.例如,`np.matrix`是`ndarray`的子类.所以`np.asanyarray(np.matrix(...))`返回相同的矩阵,而`np.asarray(np.matrix(...))`将矩阵转换为`ndarray`. (2认同)

小智 106

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

  1. 生成一个矩阵

    >>> A = numpy.matrix(numpy.ones((3,3)))
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用numpy.array修改A.因为您正在修改副本而不起作用

    >>> numpy.array(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用numpy.asarray修改A.它起作用是因为你正在修改A自己

    >>> numpy.asarray(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 2.,  2.,  2.]])
    
    Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


aba*_*ert 71

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

差异主要在于何时返回输入不变,而不是将新数组作为副本.

array提供了多种选项(大多数其他功能都是围绕它的薄包装器),包括用于确定何时复制的标志.完整的解释只需要与文档一样长(参见数组创建,但简要地说,这里有一些例子:

假设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)不会复制,因为m是a matrix,它是的子类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如果有任何naninf值则引发),子类的构造函数matrix或者像记录数组这样的特殊情况,当然还有实际的ndarray构造函数(它允许你直接创建数组)超出缓冲区的步伐).


ash*_*shr 12

该差异的文件中提到的相当清楚arrayasarray.不同之处在于参数列表,因此函数的操作取决于这些参数.

功能定义是:

numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
Run Code Online (Sandbox Code Playgroud)

numpy.asarray(a, dtype=None, order=None)
Run Code Online (Sandbox Code Playgroud)

以下参数是可以传递给的文件,array不是 asarray文档中提到的参数:

copy:bool,optional 如果为true(默认值),则复制该对象.否则,只有在__array__返回副本,obj是嵌套序列或需要副本以满足任何其他要求(dtype,order等)时才会生成副本.

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

ndmin:int,optional指定结果数组应具有的最小维数.根据需要,将根据需要预先设置形状.


off*_*555 6

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

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

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

def mysum(x):
    return np.asarray(x).sum()
Run Code Online (Sandbox Code Playgroud)