NumPy的np.array和np.asarray之间有什么区别?什么时候应该使用一个而不是另一个?它们似乎生成相同的输出。
np.array
np.asarray
vyu0f0g11#
asarray的定义是:
asarray
def asarray(a, dtype=None, order=None): return array(a, dtype, copy=False, order=order)
所以它类似于array,除了它有更少的选项,而copy=False . array默认有copy=True。主要区别在于array(默认情况下)将复制对象,而asarray除非必要,否则不会复制对象。
array
copy=False
copy=True
okxuctiv2#
由于其他问题被重定向到这个问题,询问asanyarray或other array creation routines,因此可能值得简要总结一下它们各自的功能。区别主要在于何时返回未更改的输入,而不是创建一个新数组作为副本。array提供了各种各样的选项(大多数其他函数都是围绕它的薄 Package ),包括用于确定何时复制的标志。完整的解释将与文档一样长(参见数组创建,但简要地说,这里有一些例子:假设a是ndarray,m是matrix,它们都有float32的dtype:
asanyarray
a
ndarray
m
matrix
float32
dtype
np.array(a)
np.array(m)
np.array(a, copy=False)
np.array(m, copy=False)
np.array(a, copy=False, subok=True)
np.array(m, copy=False, subok=True)
np.array(a, dtype=int, copy=False, subok=True)
大多数其他函数都是围绕array的瘦 Package 器,用于控制何时发生复制:
subok=True
ascontiguousarray
order='C')
asfortranarray
order='F'
require
copy
fromiter
object
还有一些方便的函数,如asarray_chkfinite(与asarray相同的复制规则,但如果存在任何nan或inf值,则引发ValueError),以及用于子类(如matrix)或特殊情况(如记录数组)的构造函数,当然还有实际的ndarray构造函数(它允许您直接在缓冲区上创建一个数组)。
asarray_chkfinite
nan
inf
ValueError
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
>>> numpy.array(A)[2] = 2 >>> A matrix([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]])
1.使用numpy.asarray来修改A。之所以成功,是因为您正在修改A本身。
numpy.asarray
>>> numpy.asarray(A)[2] = 2 >>> A matrix([[ 1., 1., 1.], [ 1., 1., 1.], [ 2., 2., 2.]])
hkmswyz64#
在array和asarray的文档中已经很清楚地提到了它们的区别。区别在于参数列表,因此函数的操作取决于这些参数。函数定义如下:
numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
和
numpy.asarray(a, dtype=None, order=None)
下面的参数是可以传递给array和notasarray的参数,如文档中所述:copy:bool,optional如果为true(默认),则对象被复制。否则,只有当__array__返回副本,obj是嵌套序列,或者需要一个副本来满足任何其他要求(dtype,order等)时,才会进行复制。subok:bool,optional如果为True,则子类将被传递,否则返回的数组将被强制为基类数组(默认)。ndmin:int,optional指定结果数组应该具有的最小维数。将根据需要在形状前添加1以满足此要求。
__array__
oogrdqng5#
asarray(x)类似于array(x, copy=False)如果要确保在执行任何其他操作之前x将是一个数组,请使用asarray(x)。如果x已经是一个数组,则不会执行任何复制。这不会导致冗余性能下降。下面是一个确保x首先转换为数组的函数的示例。
asarray(x)
array(x, copy=False)
x
def mysum(x): return np.asarray(x).sum()
hec6srdp6#
这里有一个简单的例子,可以证明差异。主要的区别是数组将复制原始数据,并使用不同的对象,我们可以修改原始数组中的数据。
import numpy as np a = np.arange(0.0, 10.2, 0.12) int_cvr = np.asarray(a, dtype = np.int64)
数组(a)中的内容保持不变,并且我们仍然可以使用另一个对象对数据执行任何操作,而无需修改原始数组中的内容。
fjaof16o7#
让我们通过下面的例子来理解np.array()和np.asarray()之间的区别:
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。
arr
asarray()
np.asarray(arr)[3] = 200; # array([1., 200, 1., 1., 1.])
这个数组中发生了变化,因为我们现在正在使用原始数组。
7条答案
按热度按时间vyu0f0g11#
asarray
的定义是:所以它类似于
array
,除了它有更少的选项,而copy=False
.array
默认有copy=True
。主要区别在于
array
(默认情况下)将复制对象,而asarray
除非必要,否则不会复制对象。okxuctiv2#
由于其他问题被重定向到这个问题,询问
asanyarray
或other array creation routines,因此可能值得简要总结一下它们各自的功能。区别主要在于何时返回未更改的输入,而不是创建一个新数组作为副本。
array
提供了各种各样的选项(大多数其他函数都是围绕它的薄 Package ),包括用于确定何时复制的标志。完整的解释将与文档一样长(参见数组创建,但简要地说,这里有一些例子:假设
a
是ndarray
,m
是matrix
,它们都有float32
的dtype
: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
是matrix
,它是ndarray
的子类。np.array(a, dtype=int, copy=False, subok=True)
将复制两者,因为dtype
不兼容。大多数其他函数都是围绕
array
的瘦 Package 器,用于控制何时发生复制:asarray
:如果输入是兼容的ndarray
(copy=False
),则返回未复制的输入。asanyarray
:如果输入是兼容的ndarray
或matrix
(copy=False
,subok=True
)子类,则返回未复制的输入。ascontiguousarray
:如果输入是连续C顺序的兼容ndarray
(copy=False
,order='C')
.asfortranarray
:如果输入是以连续Fortran顺序(copy=False
,order='F'
)兼容的ndarray
,则将返回未复制的输入。require
:如果输入与指定的需求字符串兼容,则返回未复制的输入。copy
:输入总是被复制。fromiter
:输入被视为可迭代对象(例如,您可以从迭代器的元素构造数组,而不是使用迭代器构造object
数组);总是抄。还有一些方便的函数,如
asarray_chkfinite
(与asarray
相同的复制规则,但如果存在任何nan
或inf
值,则引发ValueError
),以及用于子类(如matrix
)或特殊情况(如记录数组)的构造函数,当然还有实际的ndarray
构造函数(它允许您直接在缓冲区上创建一个数组)。2w3kk1z53#
这个例子可以说明这种差异:
1.生成矩阵。
1.使用
numpy.array
修改A
。因为您正在修改一个副本,所以不起作用。1.使用
numpy.asarray
来修改A
。之所以成功,是因为您正在修改A
本身。hkmswyz64#
在
array
和asarray
的文档中已经很清楚地提到了它们的区别。区别在于参数列表,因此函数的操作取决于这些参数。函数定义如下:
和
下面的参数是可以传递给
array
和notasarray
的参数,如文档中所述:copy:bool,optional如果为true(默认),则对象被复制。否则,只有当
__array__
返回副本,obj是嵌套序列,或者需要一个副本来满足任何其他要求(dtype,order等)时,才会进行复制。subok:bool,optional如果为True,则子类将被传递,否则返回的数组将被强制为基类数组(默认)。
ndmin:int,optional指定结果数组应该具有的最小维数。将根据需要在形状前添加1以满足此要求。
oogrdqng5#
asarray(x)
类似于array(x, copy=False)
如果要确保在执行任何其他操作之前
x
将是一个数组,请使用asarray(x)
。如果x
已经是一个数组,则不会执行任何复制。这不会导致冗余性能下降。下面是一个确保
x
首先转换为数组的函数的示例。hec6srdp6#
这里有一个简单的例子,可以证明差异。
主要的区别是数组将复制原始数据,并使用不同的对象,我们可以修改原始数组中的数据。
数组(a)中的内容保持不变,并且我们仍然可以使用另一个对象对数据执行任何操作,而无需修改原始数组中的内容。
fjaof16o7#
让我们通过下面的例子来理解
np.array()
和np.asarray()
之间的区别:**np.array():**将输入数据(列表、元组、数组或其他序列类型)转换为ndarray,并默认复制输入数据。
**np.asarray():**将输入数据转换为ndarray,但如果输入已经是ndarray,则不复制。
数组中没有变化,因为我们修改了
arr
的副本。现在,使用
asarray()
方法修改arr
。这个数组中发生了变化,因为我们现在正在使用原始数组。