np.array()和np.asarray()有什么区别?

NumPy的np.arraynp.asarray之间有什么区别?什么时候我应该使用其中一种而不是另一种?它们似乎产生了相同的输出。

167285 次浏览

asarray的定义是:

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

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

主要的区别是array(默认)将创建对象的副本,而asarray除非必要,否则不会。

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,则子类将为 传递,否则返回的数组将被强制为a 基类数组(默认).

ndmin: int, optional指定最小维度数 结果数组应该有。一个将预先挂在形状

.

.

.

这种差异可以通过下面的例子来证明:

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

这里有一个简单的例子可以说明这种区别。

主要区别是数组会复制原始数据,而使用不同的对象我们可以修改原始数组中的数据。

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

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

由于其他问题都被重定向到这个问题,即asanyarray其他数组创建例程,因此可能有必要对它们各自的功能进行简要总结。

区别主要在于什么时候不加改动地返回输入,而不是创建一个新数组作为副本。

array提供了各种各样的选项(大多数其他函数都是围绕它的薄包装器),包括确定何时复制的标志。一个完整的解释将需要和文档一样长的时间(参见创建数组,但简单地,这里有一些例子:

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

大多数其他函数都是array的薄包装器,用于控制复制发生的时间:

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

还有一些方便的函数,比如asarray_chkfinite(与asarray相同的复制规则,但如果有任何naninf值,则会引发ValueError),还有子类的构造函数,比如matrix或记录数组等特殊情况,当然还有实际的ndarray构造函数(它允许你直接在缓冲区上跨步创建数组)。

asarray(x)类似于array(x, copy=False)

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

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

def mysum(x):
return np.asarray(x).sum()
让我们通过例子来理解np.array()np.asarray()之间的区别:

np.array ():将输入数据(列表、元组、数组或其他序列类型)转换为ndarray并默认复制输入数据。

np.asarray():将输入数据转换为ndarray,但如果输入已经是ndarray,则不复制。

#Create an array...


arr = np.ones(5);  # array([1., 1., 1., 1., 1.])
#Now I want to modify `arr` with `array` method. Let's see...


arr = np.array(arr)[3] = 200;  # array([1., 1., 1., 1., 1.])

数组没有变化,因为我们修改了arr的副本。

现在,用asarray()方法修改arr

arr = np.asarray(arr)[3] = 200;  # array([1., 200, 1., 1., 1.])

这个数组发生了变化,因为我们现在使用的是原始数组。