内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
numpy.amax()将在数组中找到最大值,并且numpy.amin()对min值也这样做。如果我想同时找到max和min,我必须调用这两个函数,这需要两次传递(非常大的)数组,这看起来很慢。
在numpy API中是否有一个函数可以同时找到max和min,并且只需要一次遍历数据?
考虑以下伪代码:
minval = array[0] maxval = array[0] for i in array: if i < minval: minval = i if i > maxval: maxval = i
这种时间复杂度是很小的。下面是一些Fortran代码,可以通过f2py
(也许是Cython
GUU可以将其与优化的C版本进行比较):
subroutine minmax1(a,n,amin,amax) implicit none !f2py intent(hidden) :: n !f2py intent(out) :: amin,amax !f2py intent(in) :: a integer n real a(n),amin,amax integer i amin = a(1) amax = a(1) do i=2, n if(a(i) > amax)then amax = a(i) elseif(a(i) < amin) then amin = a(i) endif enddo end subroutine minmax1 subroutine minmax2(a,n,amin,amax) implicit none !f2py intent(hidden) :: n !f2py intent(out) :: amin,amax !f2py intent(in) :: a integer n real a(n),amin,amax amin = minval(a) amax = maxval(a) end subroutine minmax2
通过以下方式汇编:
f2py -m untitled -c fortran_code.f90
现在我们在一个可以测试它的地方:
import timeit size = 100000 repeat = 10000 print timeit.timeit( 'np.min(a); np.max(a)', setup='import numpy as np; a = np.arange(%d, dtype=np.float32)' % size, number=repeat), " # numpy min/max" print timeit.timeit( 'untitled.minmax1(a)', setup='import numpy as np; import untitled; a = np.arange(%d, dtype=np.float32)' % size, number=repeat), '# minmax1' print timeit.timeit( 'untitled.minmax2(a)', setup='import numpy as np; import untitled; a = np.arange(%d, dtype=np.float32)' % size, number=repeat), '# minmax2'
结果如下:
8.61869883537 # numpy min/max 1.60417699814 # minmax1 2.30169081688 # minmax2