如何在Python中查找数组中不是100的n个最大数的索引

2024-06-25 23:06:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找到一个数组的索引,该数组由n个从大到小的最大数组成,在Python中不是100。我已经找到了几种不同的方法来从数组中查找前n个最大值,以及排除等于100的值的方法,但没有一种方法可以保留索引。这就是阵列的外观:

array([ 10,  10,  11,  11,  10,  10,  12,  12,  10,  10,  10,  13,  14,
        14,  15, 100,  15,  12,  13,  11,  10,  12,  14,  14, 100, 100,
       100,  12,  13,  10,  10,  11,  13, 100, 100,  13,  14,  13,  12,
        10,  10,  11,  10, 100, 100, 100,  12,  13,  12,  13,  10,  10,
        10,  15, 100,  14,  14,  11,  12,  12,  10,  10,  10,  15,  15,
        14,  10,  10,  10,  11,  10,  10,  10,  12,  11,  11,  10,  10,
        10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
        10,  10,  10,  10,  10,  10,  10,  10,  10])

对于n为10,我希望输出如下: 数组([14,16,63,64,12,13,22,23,55,56])

如果可能的话,我最好寻找一个行程序/一种不使用传统if/elif分拣机的高效方法。让我知道措辞是否混乱,或者这个问题是否已经解决


Tags: 方法程序if数组传统array外观elif
3条回答

假设数组a有如下数据。您可以找到前n个最大值的索引,如下所示:

import numpy as np

a=np.array([ 10,  10,  11,  11,  10,  10,  12,  12,  10,  10,  10,  13,  14,
        14,  15, 100,  15,  12,  13,  11,  10,  12,  14,  14, 100, 100,
       100,  12,  13,  10,  10,  11,  13, 100, 100,  13,  14,  13,  12,
        10,  10,  11,  10, 100, 100, 100,  12,  13,  12,  13,  10,  10,
        10,  15, 100,  14,  14,  11,  12,  12,  10,  10,  10,  15,  15,
        14,  10,  10,  10,  11,  10,  10,  10,  12,  11,  11,  10,  10,
        10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
        10,  10,  10,  10,  10,  10,  10,  10,  10])

aindexes=list(np.arange(0,a.shape[0])) # indexes of elements in a [0 1 2 ... 99]

sorted_a,sorteda_indexes=(list(t) for t in zip(*sorted(zip(a, aindexes),reverse=True))) #sort a in decending order and keep record of original indexes

n=10
topn_indx=sorteda_indexes[0:n] # select top n indexes
print("Top n largest values' indexes:",topn_indx)

它将打印前10个索引,如下所示:

Top n largest values' indexes: [54, 45, 44, 43, 34, 33, 26, 25, 24, 15]

希望这有帮助

首先,对列表进行排序,但要跟踪原始索引。在下面的解决方案中,我使用元组

然后,在排序列表上向后移动,如果该值不是valueToIgnore,则将该标记附加到res,直到res的长度为n

n = 10
valueToIgnore = 100
array = [ 10,  10,  11,  11,  10,  10,  12,  12,  10,  10,  10,  13,  14,
        14,  15, 100,  15,  12,  13,  11,  10,  12,  14,  14, 100, 100,
       100,  12,  13,  10,  10,  11,  13, 100, 100,  13,  14,  13,  12,
        10,  10,  11,  10, 100, 100, 100,  12,  13,  12,  13,  10,  10,
        10,  15, 100,  14,  14,  11,  12,  12,  10,  10,  10,  15,  15,
        14,  10,  10,  10,  11,  10,  10,  10,  12,  11,  11,  10,  10,
        10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
        10,  10,  10,  10,  10,  10,  10,  10,  10]

array = [(i, val) for i,val in enumerate(array)]
array.sort(key= lambda x: x[1])

res = []
for i in range(len(array)-1, -1, -1):
    if len(res) == n: break

    if array[i][1] != valueToIgnore:
        res.append(array[i][0])

print(sorted(res))
# This will print [14, 16, 23, 36, 53, 55, 56, 63, 64, 65]

我们可以使用numpy的argsort方法,该方法根据升序中的值对索引进行排序,并使用where方法将所有100转换为NaN

a = np.array([ 10,  10,  11,  11,  10,  10,  12,  12,  10,  10,  10,  13,  14,
    14,  15, 100,  15,  12,  13,  11,  10,  12,  14,  14, 100, 100,
   100,  12,  13,  10,  10,  11,  13, 100, 100,  13,  14,  13,  12,
    10,  10,  11,  10, 100, 100, 100,  12,  13,  12,  13,  10,  10,
    10,  15, 100,  14,  14,  11,  12,  12,  10,  10,  10,  15,  15,
    14,  10,  10,  10,  11,  10,  10,  10,  12,  11,  11,  10,  10,
    10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
    10,  10,  10,  10,  10,  10,  10,  10,  10])

n=3

nan_100 = np.where(a==100,np.NaN,a)

nan_count = sum(np.isnan(nan_100))

print(nan_100.argsort()[-1*n-nan_count:-1*nan_count][::-1])

在这里,nan_100变量将具有数组,其中100被转换为nan。我已经计算了nan的值,因为argsort会将所有nan索引移到末尾

输出:

array([64, 53, 16])

相关问题 更多 >