4

根据文档,ndarray.flat是数组的迭代器,同时ndarray.ravel返回扁平数组(如果可能)。所以我的问题是,我们什么时候应该使用其中一个?哪一个更适合作为赋值中的右值,例如下面代码中的右值?

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()
4

1 回答 1

4

你也不需要。crd[mask]已经是一维了。如果你这样做了,numpy 总是np.asarray(rhs)首先调用,所以如果不需要副本,它是相同的ravel。当需要副本时,我想ravel目前可能会更快(我没有计时)。

如果您知道可能需要一个副本,并且在这里您知道什么都不需要,那么重塑points实际上可能是最快的。由于您通常不需要最快,我会说这更多的是品味问题,并且个人可能会使用ravel.

于 2013-10-07T15:52:38.687 回答