如何不仅选择`numpy.ndarray`的最大值,而选择python中的前3个最大值?

时间:2011-06-06 18:06:14

标签: python select numpy max

我有一个存储在row类型的变量<type 'numpy.ndarray'>中的浮点值列表(正值和负值)。

max_value = max(row)

给出了row的最大值。有没有一种优雅的方法来选择前3(5,10,...)值?

我想出了

  1. row
  2. 中选择最大值
  3. 删除row
  4. 中的最大值
  5. row
  6. 中选择最大值
  7. 删除row
  8. 中的最大值
  9. 但这肯定是一种丑陋的风格,而不是pythonic。蟒蛇人对此说了些什么? :)


    修改

    我不仅需要最大三个值,也就是位置(row中的索引)。对不起,我忘了提到......

3 个答案:

答案 0 :(得分:9)

我会使用np.argsort

a = np.arange(10)
a[np.argsort(a)[-3:]]

修改 要获得该职位,只需使用:

ii = np.argsort(a)[-3:] # positions
vals = a[ii]            # values

答案 1 :(得分:1)

为什么不对numpy数组进行排序,然后读取所需的值:

In [33]: np.sort(np.array([1,5,4,6,7,2,3,9]))[-3:]
Out[33]: array([6, 7, 9])

编辑:看到问题现在已经改变,您需要位置和值,使用numpy.argsort来获取索引而不是值:

In [43]: a=np.array([1,5,4,6,7,2,3,9])

In [44]: idx=np.argsort(a)

In [45]: topvals=idx[-3:]

In [46]: print topvals
[3 4 7]

In [47]: print a[topvals]
[6 7 9]

答案 2 :(得分:1)

这个丑陋的伎俩比argsort()[-3:]快一点,至少在我的旧mac ppc上的numpy 1.5.1中。 argpartsort中的Bottleneck, 一些用Cython编写的NumPy数组函数会更快。

#!/bin/sh

python -mtimeit -s '
import numpy as np

def max3( A ):
   j = A.argmax();  aj = A[j];  A[j] = - np.inf
   j2 = A.argmax();  aj2 = A[j2];  A[j2] = - np.inf
   j3 = A.argmax()
   A[j] = aj
   A[j2] = aj2
   return [j, j2, j3]

N = '${N-1e6}'
A = np.arange(N)
' '
j3 = A.argsort()[-3:]   # N 1e6: 405 msec per loop
# j3 = max3( A )        # N 1e6: 105 msec per loop
'