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

Posted

技术标签:

【中文标题】Numpy 的 array() 和 asarray() 函数有啥区别?【英文标题】:What is the difference between Numpy's array() and asarray() functions?Numpy 的 array() 和 asarray() 函数有什么区别? 【发布时间】:2013-01-03 03:44:47 【问题描述】:

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

【问题讨论】:

【参考方案1】:

由于其他问题被重定向到这个询问asanyarray 或other array creation routines 的问题,因此可能值得简要总结一下它们各自的作用。

区别主要在于何时将输入原样返回,而不是制作一个新数组作为副本。

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

假设andarraymmatrix,它们都有dtypefloat32

np.array(a)np.array(m) 将复制两者,因为这是默认行为。 np.array(a, copy=False)np.array(m, copy=False) 将复制 m 但不会复制 a,因为 m 不是 ndarraynp.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:如果输入是兼容的 ndarray 在连续 C 顺序中(copy=Falseorder='C')),则输入将未复制返回。 asfortranarray:如果输入是兼容的 ndarray,则将在连续 Fortran 顺序(copy=Falseorder='F')中未复制地返回。 require: 如果输入与指定的要求字符串兼容,则输入将原封不动地返回。 copy:输入总是被复制的。 fromiter:输入被视为可迭代的(例如,您可以从迭代器的元素构造一个数组,而不是使用迭代器的object 数组);总是被复制。

还有一些便利函数,例如asarray_chkfinite(与asarray 相同的复制规则,但如果有任何naninf 值,则引发ValueError),以及子类的构造函数,例如matrix 或对于像记录数组这样的特殊情况,当然还有实际的 ndarray 构造函数(它可以让您直接在缓冲区上跨步创建一个数组)。

【讨论】:

谢谢,很有帮助 纠正一下,Numpy 的 ndarray 现在将 float64 作为默认 dtype。 在第一部分,在第 4 点,您实际上的意思是 --- "np.array(a, dtype=int, copy=False, subok=True) np.array(m, dtype=int, copy=False, subok=True) 将复制两者,因为 @987654386 @ 不兼容。” --- 对吗?提前致谢! 对此表示感谢!【参考方案2】:

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

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

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

def mysum(x):
    return np.asarray(x).sum()

【讨论】:

【参考方案3】:

这个例子可以证明区别:

    生成矩阵

    >>> A = numpy.matrix(numpy.ones((3,3)))
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
    

    使用numpy.array 修改A。不起作用,因为您正在修改副本

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

    使用numpy.asarray 修改A。它起作用了,因为您正在修改 A 本身

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

希望这会有所帮助!

【讨论】:

【参考方案4】:

这里有一个简单的例子,可以证明不同之处。

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

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

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

【讨论】:

【参考方案5】:

definition of asarray 是:

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

所以它就像array,只是它的选项更少,还有copy=Falsearray 默认有 copy=True

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

【讨论】:

那么我们应该什么时候使用它们呢?如果从头开始创建数组,array([1, 2, 3])asarray([1, 2, 3]) 哪个更好? @endolith: [1, 2, 3] 是一个 Python 列表,因此必须复制数据以创建 ndarary。所以直接使用np.array 而不是np.asarray,这会将copy=False 参数发送到np.array。如果必须像在这种情况下那样制作副本,则忽略copy=False。如果您在 IPython 中使用 %timeit 对两者进行基准测试,您会发现小型列表的差异,但对于大型列表,您使用哪个几乎无关紧要。 根据方法名称也是有道理的:“asarray”:将其视为一个数组(就地),也就是说,你只是在改变你对这个列表/数组的看法。 "array": 实际上把它转换成一个新的数组。 np.asanyarray 怎么样? @Lee: asarray 总是返回一个ndarrayasanyarray 将返回 ndarray 的子类,如果这是传递给它的内容。例如,np.matrixndarray 的子类。所以np.asanyarray(np.matrix(...)) 返回相同的矩阵,而np.asarray(np.matrix(...)) 将矩阵转换为ndarray【参考方案6】:

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 是一个嵌套序列,或者如果需要一个副本来满足任何 其他要求(数据类型、顺序等)。

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

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

【讨论】:

以上是关于Numpy 的 array() 和 asarray() 函数有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

numpy之ones,array,asarray

Numpy asanyarray 与 asarray 的任何示例?

shared_x = theano.shared(numpy.asarray(data_x, dtype=theano.config.floatX))这句话啥意思?

NumPy来自现有数据的数组

PIL中的Image和numpy中的数组array相互转换

numpy笔记