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

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

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    由于其他问题被重定向到这个询问asanyarrayother 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 不是 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:如果输入是兼容的 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】:

      这个例子可以证明区别:

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

      希望这会有所帮助!

      【讨论】:

        【解决方案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 指定最小维数 结果数组应该有。那些将预先添加到形状 根据需要满足此要求。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-12-03
            • 1970-01-01
            • 1970-01-01
            • 2015-05-09
            相关资源
            最近更新 更多