Numpy 的 array() 和 asarray() 函数有啥区别?
Posted
技术标签:
【中文标题】Numpy 的 array() 和 asarray() 函数有啥区别?【英文标题】:What is the difference between Numpy's array() and asarray() functions?Numpy 的 array() 和 asarray() 函数有什么区别? 【发布时间】:2013-01-03 03:44:47 【问题描述】:Numpy 的array()
和asarray()
函数有什么区别?什么时候应该使用一种而不是另一种?它们似乎为我能想到的所有输入生成相同的输出。
【问题讨论】:
【参考方案1】:由于其他问题被重定向到这个询问asanyarray
或other array creation routines 的问题,因此可能值得简要总结一下它们各自的作用。
区别主要在于何时将输入原样返回,而不是制作一个新数组作为副本。
array
提供了多种选项(大多数其他功能都是围绕它的薄包装),包括确定何时复制的标志。完整的解释与文档一样长(请参阅Array Creation,但简单来说,这里有一些示例:
假设a
是ndarray
,m
是matrix
,它们都有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
是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
:如果输入是兼容的 ndarray
在连续 C 顺序中(copy=False
、order='C')
),则输入将未复制返回。
asfortranarray
:如果输入是兼容的 ndarray
,则将在连续 Fortran 顺序(copy=False
、order='F'
)中未复制地返回。
require
: 如果输入与指定的要求字符串兼容,则输入将原封不动地返回。
copy
:输入总是被复制的。
fromiter
:输入被视为可迭代的(例如,您可以从迭代器的元素构造一个数组,而不是使用迭代器的object
数组);总是被复制。
还有一些便利函数,例如asarray_chkfinite
(与asarray
相同的复制规则,但如果有任何nan
或inf
值,则引发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】:这个例子可以证明区别:
生成矩阵
>>> 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.]])
希望这会有所帮助!
【讨论】:
【参考方案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=False
。 array
默认有 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
总是返回一个ndarray
。 asanyarray
将返回 ndarray
的子类,如果这是传递给它的内容。例如,np.matrix
是ndarray
的子类。所以np.asanyarray(np.matrix(...))
返回相同的矩阵,而np.asarray(np.matrix(...))
将矩阵转换为ndarray
。【参考方案6】:
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 是一个嵌套序列,或者如果需要一个副本来满足任何 其他要求(数据类型、顺序等)。subok : bool, optional 如果为真,那么子类将是 传递,否则返回的数组将被强制为 基类数组(默认)。
ndmin : int, optional 指定最小维数 结果数组应该有。那些将预先添加到形状 根据需要满足此要求。
【讨论】:
以上是关于Numpy 的 array() 和 asarray() 函数有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
Numpy asanyarray 与 asarray 的任何示例?
shared_x = theano.shared(numpy.asarray(data_x, dtype=theano.config.floatX))这句话啥意思?