【发布时间】:2013-01-03 03:44:47
【问题描述】:
【问题讨论】:
【问题讨论】:
由于其他问题被重定向到这个询问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 构造函数(它可以让您直接在缓冲区上跨步创建一个数组)。
【讨论】:
np.array(a, dtype=int, copy=False, subok=True) 和 np.array(m, dtype=int, copy=False, subok=True) 将复制两者,因为 @987654386 @ 不兼容。” --- 对吗?提前致谢!
asarray(x) 就像array(x, copy=False)
如果您希望在完成任何其他操作之前确保x 将是一个数组,请使用asarray(x)。如果x 已经是一个数组,则不会进行任何复制。它不会导致多余的性能损失。
这是一个确保x首先转换为数组的函数示例。
def mysum(x):
return np.asarray(x).sum()
【讨论】:
这个例子可以证明区别:
生成矩阵
>>> 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) 中的内容保持不变,我们仍然可以使用另一个对象对数据执行任何操作,而无需修改原始数组中的内容。
【讨论】:
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]) 哪个更好?
[1, 2, 3] 是一个 Python 列表,因此必须复制数据以创建 ndarary。所以直接使用np.array 而不是np.asarray,这会将copy=False 参数发送到np.array。如果必须像在这种情况下那样制作副本,则忽略copy=False。如果您在 IPython 中使用 %timeit 对两者进行基准测试,您会发现小型列表的差异,但对于大型列表,您使用哪个几乎无关紧要。
np.asanyarray 怎么样?
asarray 总是返回一个ndarray。 asanyarray 将返回 ndarray 的子类,如果这是传递给它的内容。例如,np.matrix 是ndarray 的子类。所以np.asanyarray(np.matrix(...)) 返回相同的矩阵,而np.asarray(np.matrix(...)) 将矩阵转换为ndarray。
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 指定最小维数 结果数组应该有。那些将预先添加到形状 根据需要满足此要求。
【讨论】: