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]はすでに 1-d です。した場合、 numpy は常にnp.asarray(rhs)最初に呼び出すため、 のコピーが必要ない場合も同じですravel。コピーが必要な場合は、ravel現在の方が速いと思います(時間は計りませんでした)。

コピーが必要になる可能性があることを知っていて、ここではも必要ないことがわかっている場合は、再形成pointsが実際には最速である可能性があります。通常、最速は必要ないので、それは好みの問題であり、個人的にはおそらくravel.

于 2013-10-07T15:52:38.687 に答える