Numpy - 数组 vs asarray

2024-04-25 05:11:05 发布

您现在位置:Python中文网/ 问答频道 /正文

Numpy的^{}函数和^{}函数有什么区别?你应该什么时候用一个而不是另一个?它们似乎为我能想到的所有输入生成相同的输出。


Tags: 函数numpy区别
3条回答

由于其他问题正被重定向到这个问题,这个问题是关于asanyarrayother array creation routines的,所以可能有必要对它们各自的工作做一个简短的总结。

不同之处主要在于何时返回未更改的输入,而不是将新数组作为副本。

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

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

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

  • ^{}:如果输入是兼容的ndarraycopy=False),则返回未分片的输入。
  • ^{}:如果输入是兼容的ndarray或类似于matrixcopy=Falsesubok=True)的子类,则返回未分片的输入。
  • ^{}:如果输入是连续的C顺序(copy=Falseorder='C'))中的兼容的ndarray,则返回未分片的输入。
  • ^{}:如果输入是以连续的Fortran顺序(copy=Falseorder='F')兼容的ndarray,则返回未分片的输入。
  • ^{}:如果输入与指定的需求字符串兼容,则将返回uncapied。
  • ^{}:始终复制输入。
  • ^{}:输入被视为iterable(因此,例如,您可以从迭代器的元素构造数组,而不是使用迭代器构造object数组);始终被复制。

还有一些方便的函数,例如^{}(与asarray相同的复制规则,但是如果有naninf值,则会引发ValueError),以及matrix之类的子类或记录数组之类的特殊情况的构造函数,当然还有实际的^{}构造函数(它允许您直接创建一个数组缓冲区)。

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

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

希望这有帮助!

definition of ^{}是:

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

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

主要的区别是array(默认情况下)将生成对象的副本,而asarray将不会,除非有必要。

相关问题 更多 >