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

67up9zun  于 2023-04-21  发布在  其他
关注(0)|答案(7)|浏览(247)

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

vyu0f0g1

vyu0f0g11#

asarray的定义是:

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

所以它类似于array,除了它有更少的选项,而copy=False . array默认有copy=True
主要区别在于array(默认情况下)将复制对象,而asarray除非必要,否则不会复制对象。

okxuctiv

okxuctiv2#

由于其他问题被重定向到这个问题,询问asanyarrayother array creation routines,因此可能值得简要总结一下它们各自的功能。
区别主要在于何时返回未更改的输入,而不是创建一个新数组作为副本。
array提供了各种各样的选项(大多数其他函数都是围绕它的薄 Package ),包括用于确定何时复制的标志。完整的解释将与文档一样长(参见数组创建,但简要地说,这里有一些例子:
假设andarraymmatrix,它们都有float32dtype

  • 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的瘦 Package 器,用于控制何时发生复制:

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

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

2w3kk1z5

2w3kk1z53#

这个例子可以说明这种差异:
1.生成矩阵。

>>> A = numpy.matrix(numpy.ones((3, 3)))
 >>> A
 matrix([[ 1.,  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.]])

1.使用numpy.asarray来修改A。之所以成功,是因为您正在修改A本身。

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

hkmswyz64#

arrayasarray的文档中已经很清楚地提到了它们的区别。区别在于参数列表,因此函数的操作取决于这些参数。
函数定义如下:

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

numpy.asarray(a, dtype=None, order=None)

下面的参数是可以传递给arraynotasarray的参数,如文档中所述:
copy:bool,optional如果为true(默认),则对象被复制。否则,只有当__array__返回副本,obj是嵌套序列,或者需要一个副本来满足任何其他要求(dtype,order等)时,才会进行复制。
subok:bool,optional如果为True,则子类将被传递,否则返回的数组将被强制为基类数组(默认)。
ndmin:int,optional指定结果数组应该具有的最小维数。将根据需要在形状前添加1以满足此要求。

oogrdqng

oogrdqng5#

asarray(x)类似于array(x, copy=False)
如果要确保在执行任何其他操作之前x将是一个数组,请使用asarray(x)。如果x已经是一个数组,则不会执行任何复制。这不会导致冗余性能下降。
下面是一个确保x首先转换为数组的函数的示例。

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

hec6srdp6#

这里有一个简单的例子,可以证明差异。
主要的区别是数组将复制原始数据,并使用不同的对象,我们可以修改原始数组中的数据。

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

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

fjaof16o

fjaof16o7#

让我们通过下面的例子来理解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...

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

数组中没有变化,因为我们修改了arr的副本。
现在,使用asarray()方法修改arr

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

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

相关问题