我有一个存储在row
类型的变量<type 'numpy.ndarray'>
中的浮点值列表(正值和负值)。
max_value = max(row)
给出了row
的最大值。有没有一种优雅的方法来选择前3(5,10,...)值?
我想出了
row
row
row
row
但这肯定是一种丑陋的风格,而不是pythonic。蟒蛇人对此说了些什么? :)
我不仅需要最大三个值,也就是位置(row
中的索引)。对不起,我忘了提到......
答案 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
'