根据文档,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()
答案 0 :(得分:4)
你也不需要。 crd[mask]
已经是1-d。如果你这样做,numpy总是首先调用np.asarray(rhs)
,所以如果ravel
不需要副本,它就是相同的。当需要副本时,我猜想ravel
目前可能更快(我没有时间)。
如果您知道可能需要副本,并且在此知道无需,则重塑points
实际上可能是最快的。既然你通常不需要最快,我会说它更多是品味问题,而且个人可能会使用ravel
。