numpyの2次元配列で各行をとり、特定の計算のスカラー結果を返す関数を実装しようとしています。私の現在のコードは次のようになります。numpy apply_along_axisベクトル化
img = np.array([
[0, 5, 70, 0, 0, 0 ],
[10, 50, 4, 4, 2, 0 ],
[50, 10, 1, 42, 40, 1 ],
[10, 0, 0, 6, 85, 64],
[0, 0, 0, 1, 2, 90]]
)
def get_y(stride):
stride_vals = stride[stride > 0]
pix_thresh = stride_vals.max() - 1.5*stride_vals.std()
return np.argwhere(stride>pix_thresh).mean()
np.apply_along_axis(get_y, 0, img)
>> array([ 2. , 1. , 0. , 2. , 2.5, 3.5])
期待どおりに動作します実際のデータセットに〜2kの行や〜、フレームごとに20〜50列があるとして、しかし、パフォーマンスは60回来て、素晴らしいではありません秒。
おそらくnp.apply_along_axis
機能を使用しないことによってプロセスをスピードアップする方法はありますか?
私はapply_along_axisが単純な行の反復よりも遅いと予想します。 – hpaulj
@hpaulj私はそれをテストしましたが、実際には速度を上げるには反復処理を少し遅くしています。何か特別な理由はありますか?軸に沿って適用すると一般に行の反復よりも遅い場合、そのような機能を持つ点は何ですか? – ymoiseev
便宜。それはあなたが読むことができるPythonコードです。ループや関数の評価はコンパイルされません。ループを一般化するだけで、複数の次元(4次元配列の他の3つ)での評価を簡単に表現できます。ループインデックスを生成するために 'np.ndindex'を使います。 – hpaulj