是否有更快的方法来分隔两个数组的最小值和最大值?

end*_*ith 4 python numpy minimum where

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
Run Code Online (Sandbox Code Playgroud)

比如,也许有一种方法可以where一步完成两个命令并返回2个?

为什么没有amin以相同的方式实现where,如果它更快?

Joh*_*yon 5

使用numpy的内置元素maximumminimum- 它们比...更快where.numpy docs中的注释最大限度证实了这一点:

相当于np.where(x1> x2,x1,x2),但更快,并进行适当的广播.

你想要第一次测试的那一行是这样的:

fmin = np.minimum(f1, f2); fmax = np.maximum(f1, f2)
Run Code Online (Sandbox Code Playgroud)

我自己的结果显示这要快得多.请注意,只要两个参数的形状相同minimum,它们maximum就适用于任何n维数组.

Using amax                    3.506
Using sort                    1.830
Using where                   0.635
Using numpy maximum, minimum  0.178
Run Code Online (Sandbox Code Playgroud)

  • 等等,什么!?由于某种原因,我认为那些是"amin"和"amax"的同义词.文档甚至没有相互链接.叹.这确实要快得多. (2认同)