numpy:同时用于max()和min()的函数

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

numpy.amax()将在数组中找到最大值,并且numpy.amin()对min值也这样做。如果我想同时找到max和min,我必须调用这两个函数,这需要两次传递(非常大的)数组,这看起来很慢。

在numpy API中是否有一个函数可以同时找到max和min,并且只需要一次遍历数据?

提问于
用户回答回答于

没有比在一个大数组上调用numpy.amin()numpy.amax())更好的方法了。

用户回答回答于

考虑以下伪代码:

minval = array[0]
maxval = array[0]
for i in array:
    if i < minval:
       minval = i
    if i > maxval:
       maxval = i

这种时间复杂度是很小的。下面是一些Fortran代码,可以通过f2py(也许是CythonGUU可以将其与优化的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

扫码关注云+社区