numpy中的ravel和flat在切片赋值中有什么区别?

4
根据文档,ndarray.flat 是数组的迭代器,而ndarray.ravel (如果可能) 返回一个扁平化的数组。那么我的问题是,在什么情况下应该使用其中之一? 在像下面代码中这样的赋值语句中,哪个更好作为rvalue?
import numpy as np

x = np.arange(2).reshape((2,1,1))
y = np.arange(3).reshape((1,3,1))
z = np.arange(5).reshape((1,1,5))

mask = np.random.choice([True, False], size=(2,3,5))
# netCDF4 module wants this kind of boolean indexing:
nc4slice = tuple(mask.any(axis=axis) for axis in ((1,2),(2,0),(0,1)))
indices = np.ix_(*nc4slice)

ncrds = 3
npnts = (np.broadcast(*indices)).size
points = np.empty((npnts, ncrds))
for i,crd in enumerate(np.broadcast_arrays(x,y,z)):
    # Should we use ndarray.flat ...
    points[:,i] = crd[indices].flat
    # ... or ndarray.ravel():
    points[:,i] = crd[indices].ravel()
1个回答

4
您不需要使用任何方法。数组 crd[mask] 已经是一维的了。如果需要,numpy 会始终先调用 np.asarray(rhs),因此如果不需要复制,则与 ravel 相同。当需要复制时,我猜测 ravel 目前可能更快(我没有计时)。
如果您知道可能需要进行复制,而这里您知道不需要,那么重塑 points 实际上可能是最快的方法。由于通常情况下您不需要最快的速度,所以我认为这更多是个人口味问题,并且个人可能会使用 ravel

我更新了示例代码,提供了一个更接近引发问题的真实情况的示例。我不理解关于asarray的那一行。我确实知道结果是相同的。实际上,我的问题是在使用flat和使用ravel时,numpy在上述代码中做了什么(在幕后)? - joanpau
这就是我所说的,它在幕后对右侧进行了“np.asarray”(有效)调用,这意味着“arr.flat”无论如何都会被转换为数组。你使用哪个都没关系。 - seberg
好的,我的上一个问题应该是:假设asarray方法在输入已经是数组时不会执行任何操作,那么当输入是迭代器时,asarray会做什么呢?文档没有提到数组迭代器。 - joanpau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接