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
就像,也许有一种方法可以一步完成两个where
命令并返回2个?
为什么amin
的实施方式与where
的实施方式相同,如果它的速度要快得多?
答案 0 :(得分:5)
使用numpy的内置元素maximum
和minimum
- 它们比where
更快。
numpy docs for maximum中的注释证实了这一点:
相当于np.where(x1> x2,x1,x2),但更快,并进行适当的广播。
您第一次测试所需的行将是:
fmin = np.minimum(f1, f2); fmax = np.maximum(f1, f2)
我自己的结果显示这要快得多。请注意,只要两个参数的形状相同,minimum
和maximum
将适用于任何n维数组。
Using amax 3.506
Using sort 1.830
Using where 0.635
Using numpy maximum, minimum 0.178