4
In [3]: f1 = rand(100000)
In [5]: f2 = rand(100000)

# Obvious method:
In [12]: timeit fmin = np.amin((f1, f2), axis=0); fmax = np.amax((f1, f2), axis=0)
10 loops, best of 3: 59.2 ms per loop

In [13]: timeit fmin, fmax = np.sort((f1, f2), axis=0)
10 loops, best of 3: 30.8 ms per loop

In [14]: timeit fmin = np.where(f2 < f1, f2, f1); fmax = np.where(f2 < f1, f1, f2)
100 loops, best of 3: 5.73 ms per loop


In [36]: f1 = rand(1000,100,100)

In [37]: f2 = rand(1000,100,100)

In [39]: timeit fmin = np.amin((f1, f2), axis=0); fmax = np.amax((f1, f2), axis=0)
1 loops, best of 3: 6.13 s per loop

In [40]: timeit fmin, fmax = np.sort((f1, f2), axis=0)
1 loops, best of 3: 3.3 s per loop

In [41]: timeit fmin = np.where(f2 < f1, f2, f1); fmax = np.where(f2 < f1, f1, f2)
1 loops, best of 3: 617 ms per loop

同様に、where2つのリターンを使用して1つのステップで両方のコマンドを実行する方法があるでしょうか?

がはるかに高速であるのに、なぜ とamin同じ方法で実装されないのですか?where

4

1 に答える 1

5

要素ごとに組み込まれた numpy を使用するmaximumminimum、 よりも高速ですwhere最大のnumpyドキュメントのメモは、これを確認します:

np.where(x1 > x2, x1, x2) と同等ですが、より高速で適切なブロードキャストを行います。

最初のテストに必要な行は次のようになります。

fmin = np.minimum(f1, f2); fmax = np.maximum(f1, f2)

私自身の結果は、これがかなり高速であることを示しています。minimumandmaximumは、2 つの引数が同じ形状である限り、任意の n 次元配列で機能することに注意してください。

Using amax                    3.506
Using sort                    1.830
Using where                   0.635
Using numpy maximum, minimum  0.178
于 2013-05-16T03:17:59.917 に答える