np.array
和np.asarray
之间的区别?我应该在什么情况下使用它们?它们似乎生成相同的输出。def asarray(a, dtype=None, order=None):
return array(a, dtype, copy=False, order=order)
它就像array
,但选项更少,并且copy=False
。默认情况下,array
的选项为 copy=True
。
主要区别在于,默认情况下,array
会复制对象,而asarray
只有在必要时才会。
由于其他关于asanyarray
或其他数组创建例程的问题都被重定向到这个问题,因此可能值得简要总结它们各自的作用。
它们的区别主要在于何时返回输入而不更改它,而不是制作一个作为副本的新数组。
array
提供了各种选项(大多数其它函数都只是其薄包装器),包括标志以确定何时进行复制。完整的解释将与文档一样长(请参见数组创建),但简单地说,以下是一些示例:
假设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
的薄包装,控制复制发生的时间:
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
构造函数(它允许您直接从缓冲区的跨度创建数组)。
np.array(a, dtype=int, copy=False, subok=True)
和 np.array(m, dtype=int, copy=False, subok=True)
都会复制,因为 dtype
不兼容。” --- 对吗?提前致谢! - Milan这个差异可以通过以下示例来演示:
生成一个矩阵。
>>> 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.]])
array
和asarray
的文档中已经很清楚地提到了。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是嵌套序列或需要满足任何其他要求(dtype、order等),才会进行复制。subok :bool,可选项如果为True,则将传递子类,否则返回的数组将被强制成一个基类数组(默认)。
ndmin :int,可选项指定结果数组应具有的最小维数。在需要满足此要求时会在形状前面添加1。
asarray(x)
类似于 array(x, copy=False)
在进行其他操作之前,使用 asarray(x)
来确保 x
是一个数组。如果 x
已经是一个数组,则不会复制。它不会造成冗余的性能损失。
以下是一个函数的示例,该函数确保首先将 x
转换为一个数组。
def mysum(x):
return np.asarray(x).sum()
让我们通过以下示例了解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.])
这个数组发生了变化,因为我们现在正在使用原始数组。
import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)
数组(a)中的内容保持不变,我们仍然可以使用另一个对象对数据进行任何操作,而无需修改原始数组中的内容。
np.array()
:将输入数据(如列表、元组等)转换为ndarray
,并默认情况下复制输入数据。这会在内存中创建冗余对象。np.asarray()
:将输入数据转换为ndarray
,但如果输入已经是ndarray
,则不进行复制。这更节省内存。import numpy as np
print("NumPy version:", np.__version__)
NumPy version: 1.22.3
ndarray
时使用np.array()
。# STEP 1: Initialize source.
src1 = np.ones(5)
print("Data type:", type(src1))
print("Values:\n", src1)
# STEP 2: Convert to `ndarray`.
arr1 = np.array(src1) # np.array() is used.
print("\nData type:", type(arr1))
print("Values:\n", arr1)
# STEP 3: Compare source with converted `ndarray`.
print("\nIs Source & new NumPy array same?\n", src1 is arr1)
Data type: <class 'numpy.ndarray'>
Values:
[1. 1. 1. 1. 1.]
Data type: <class 'numpy.ndarray'>
Values:
[1. 1. 1. 1. 1.]
Is Source & new NumPy array same?
False
# STEP 1: Initialize source.
src2 = np.ones(5)
print("Data type:", type(src2))
print("Values:\n", src2)
# STEP 2: Convert to `ndarray`.
arr2 = np.asarray(src2) # np.asarray() is used.
print("\nData type:", type(arr2))
print("Values:\n", arr2)
# STEP 3: Compare source with converted `ndarray`.
print("\nIs Source & new NumPy array same?\n", src2 is arr2)
Data type: <class 'numpy.ndarray'>
Values:
[1. 1. 1. 1. 1.]
Data type: <class 'numpy.ndarray'>
Values:
[1. 1. 1. 1. 1.]
Is Source & new NumPy array same?
True
ndarray
上使用np.asarray()
时,源ndarray
和转换后的ndarray
是指向内存中同一个对象。
array([1, 2, 3])
还是asarray([1, 2, 3])
? - endolith[1, 2, 3]
是Python列表,因此在创建ndarray
时必须复制数据。因此,请直接使用np.array
而不是将copy = False
参数发送到np.array
的np.asarray
。 如果必须进行复制,例如在此情况下,则会忽略copy=False
。如果在IPython中使用%timeit
对这两种方法进行基准测试,您将会看到对于小型列表会有差异,但是对于大型列表使用哪种方法并不重要。 - unutbunp.asanyarray
怎么样? - wsdzbmasarray
总是返回一个ndarray
数组。如果传递给asanyarray
的参数是ndarray
数组的子类,那么它将返回该子类。例如,np.matrix
是ndarray
数组的子类。因此,np.asanyarray(np.matrix(...))
返回相同的矩阵,而np.asarray(np.matrix(...))
将矩阵转换为一个ndarray
数组。 - unutbu