我有一个数组:
arr = [23,34,2,55,5,13,44,3]
,我想用它们的索引保存n个最大的数字。
例如,对于n = 2,我想要
[(55,3), (44,6)]
我找不到简单的方法。
我只发现了如何使用nlargest
获取n个最大项或如何使用argpartition
获取n个最大索引。
答案 0 :(得分:2)
免责声明:不是 numpy解决方案-您可以结合使用enumerate
,sorted
,生成器理解和列表切片:
n = 3
s = list(sorted( ((v,i) for i,v in enumerate([23,34,2,55,5,13,44,3]) ),reverse = True))[:n]
print(s)
输出:
[(55, 3), (44, 6), (34, 1)]
Doku:
生成器用于翻转由枚举产生的索引和值,切片会减少结果量。
答案 1 :(得分:2)
这是基于NumPy的解决方案:
In [207]: arr
Out[207]: array([23, 34, 2, 55, 5, 13, 44, 3])
# sort array `arr` in increasing order
In [208]: arr_sorted = arr[arr.argsort()]
# slice largest 3 elements
In [209]: largest_3 = arr_sorted[-3:][::-1]
In [210]: largest_3
Out[210]: array([55, 44, 34])
# get the indices that would sort the array `arr` (in increasing order)
In [211]: arr_sorted_idx = arr.argsort()
# grab the largest 3 indices in accordance with [209]/[210]
In [212]: largest_3_idx = arr_sorted_idx[-3:][::-1]
In [213]: largest_3_idx
Out[213]: array([3, 6, 1])
largest_3_idx
是原始数组arr
中最大3个元素的索引。
如果根本需要将结果作为元组列表,则使用:
In [214]: list(zip(largest_3.tolist(), largest_3_idx.tolist()))
Out[214]: [(55, 3), (44, 6), (34, 1)]
答案 2 :(得分:2)
这是一个简短的Numpy版本:
n=3 #number of largest elements to get
a = np.array([23, 34, 2, 55, 5, 13, 44, 3])
idx = a.argsort()[:-n-1:-1] #Use argsort get sorted index and slice backwards
list(zip(a[idx], idx)) #zip and list for tuples
输出:
[(55, 3), (44, 6), (34, 1)]
让我们绘制一些时间点:
import numpy
import perfplot
def sb_numpy(a,n):
idx = a.argsort()[:-n-1:-1] #Use argsort get sorted index and slice backwards
return list(zip(a[idx], idx))
def pa_pyth(a,n):
return list(sorted( ((v,i) for i,v in enumerate(a) ),reverse = True))[:n]
perfplot.show(
setup=lambda n: numpy.random.randint(0,10e7, n),
kernels=[
lambda a: sb_numpy(a,3),
lambda a: pa_pyth(a,3)
],
labels=['sb_numpy', 'pa_pyth'],
n_range=[2**k for k in range(15)],
xlabel='N'
)
输出: