Python Numpy和#x27;s array()和asarray()函数?

Python Numpy和#x27;s array()和asarray()函数?,python,arrays,numpy,Python,Arrays,Numpy,Numpy和函数之间的区别是什么?什么时候应该使用一个而不是另一个?它们似乎为我所能想到的所有输入生成了相同的输出。结果是: 因此,它类似于array,只是它的选项较少,而且copy=False数组具有copy=True 主要区别在于array(默认情况下)将创建对象的副本,而asarray除非必要,否则不会创建对象的副本。和的文档中非常清楚地提到了这些区别。区别在于参数列表,因此函数的操作取决于这些参数 函数定义如下: numpy.array(object, dtype=None, copy=

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

结果是:

因此,它类似于
array
,只是它的选项较少,而且
copy=False
<默认情况下,代码>数组具有
copy=True


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

和的文档中非常清楚地提到了这些区别。区别在于参数列表,因此函数的操作取决于这些参数

函数定义如下:

numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)

以下参数是可以传递给
array
not
asarray
的参数,如文档中所述:

复制:bool,可选如果为真(默认),则复制对象。 否则,仅当
\uuuuuu数组\uuuuu
返回副本时,才会进行复制,如果 obj是一个嵌套序列,或者如果需要一个副本来满足 其他要求(数据类型、订单等)

subok:bool,可选如果为True,则子类将为 通过,否则返回的数组将被强制为 基类数组(默认值)

ndmin:int,可选指定所需的最小维度数 生成的数组应具有。将根据形状预先悬挂 根据需要来满足这一要求


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

  • 生成矩阵

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

  • 希望这有帮助

    这里有一个简单的例子可以说明这种差异

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

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

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

    由于其他问题被重定向到这个问题,询问关于asanyarray或的问题,因此可能值得对每个问题做一个简短的总结

    import numpy as np
    a = np.arange(0.0, 10.2, 0.12)
    int_cvr = np.asarray(a, dtype = np.int64)
    
    区别主要在于何时返回未更改的输入,而不是将新数组作为副本

    提供了多种选项(大多数其他函数都是围绕它的精简包装器),包括用于确定何时复制的标志。完整的解释将花费与文档一样长的时间(请参阅,但简单地说,以下是一些示例:

    假设
    a
    ndarray
    m
    矩阵
    ,它们都有
    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)
      都不会复制,因为
      m
      矩阵
      ,它是
      ndarray
      的子类
    • np.array(a,dtype=int,copy=False,subok=True)
      将同时复制这两种类型,因为
      dtype
      不兼容
    大多数其他函数都是围绕
    array
    的薄型包装,用于控制何时进行复制:

    • :如果输入是兼容的
      ndarray
      copy=False
      ),则输入将以未复制的方式返回
    • :如果输入是兼容的
      ndarray
      或类似
      matrix
      的子类(
      copy=False
      subok=True
      ),则输入将以未复制的方式返回
    • :如果输入是连续C顺序的兼容
      ndarray
      copy=False
      order='C')
      ,则输入将以未复制的方式返回
    • :如果输入是连续Fortran顺序的兼容
      ndarray
      copy=False
      order='F'
      ),则输入将以未复制的方式返回
    • :如果输入与指定的要求字符串兼容,则将返回未经复制的输入
    • :始终复制输入
    • :输入被视为iterable(因此,例如,您可以从迭代器的元素构造数组,而不是使用迭代器构建
      对象
      数组);始终复制
    还有一些方便的函数,如(与
    asarray
    相同的复制规则,但如果存在
    nan
    inf
    值,则会引发
    ValueError
    ),以及
    matrix
    子类或记录数组等特殊情况的构造函数,当然还有实际的构造函数(这使您可以直接在缓冲区上创建一个数组)。

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

    如果要确保在执行任何其他操作之前,
    x
    将是一个数组,请使用
    asarray(x)
    。如果
    x
    已经是一个数组,则不会执行任何复制。这不会导致冗余性能损失

    下面是一个函数示例,该函数确保首先将
    x
    转换为数组

    def mysum(x):
    返回np.asarray(x).sum()
    
    那么我们应该什么时候使用它们呢?如果从头开始创建一个数组,哪个更好,
    数组([1,2,3])
    或者
    数组([1,2,3])
    ?@endolith:
    [1,2,3]
    是一个Python列表,所以c
    import numpy as np
    a = np.arange(0.0, 10.2, 0.12)
    int_cvr = np.asarray(a, dtype = np.int64)