19

n 次元の巨大な numpy 配列の軸に沿って np.std、np.sum などの関数を高速化するには、最後の軸に沿って適用することをお勧めします。

するとnp.transposeして操作したい軸を最後の軸まで回転させます。本当にメモリ内のデータを再シャッフルしているのか、それとも軸のアドレス指定方法を変更しているだけなのか?

%timeit を使用して時間を測定しようとしたとき。この転置をマイクロ秒単位で行っていました (私が持っていた (112x1024x1024) 配列をコピーするのに必要な時間よりもはるかに短い.

実際にメモリ内のデータを並べ替えておらず、アドレス指定のみを変更している場合、新しく回転した最後の軸に適用すると、np.sum または np.std が高速化されますか?

測ってみたところ、速度が速くなったようです。しかし、私は方法を理解していません。

アップデート

転置で実際にスピードアップするようには見えません。最速の軸は、C オーダーの場合は最後の軸であり、Fortran オーダーの場合は最初の軸です。したがって、np.sum または np.std を適用する前に転置しても意味がありません。私の特定のコードでは、配列の作成中に order='FORTRAN' を指定して問題を解決しました。これにより、最初の軸が最速になりました。

すべての答えをありがとう。

4

3 に答える 3

21

転置はストライドを変更するだけで、実際の配列には触れません。最終軸に沿って etc. が推奨される理由sum(そのソースを知りたいのですが) は、配列が C 順序付けされている場合、最終軸に沿って歩くと参照の局所性が保持されるためだと思います。転置された配列は Fortran 順になるため、転置後はそうではありません。

于 2013-10-20T15:49:59.957 に答える