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

如何在Python中查找数组中不是100的n个最大数的索引,python,arrays,pandas,numpy,Python,Arrays,Pandas,Numpy,我试图找到一个数组的索引,该数组由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, 1

我试图找到一个数组的索引,该数组由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分拣机的高效方法。让我知道措辞是否混乱,或者这个问题是否已经解决

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

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

我们可以使用numpy的方法,该方法按照值的升序对索引进行排序,并使用该方法将所有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])
假设数组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]

希望这有帮助。

很抱歉,我打开了这个问题,实际上我可以使用argsort解决它:

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
NumOf100s = np.count_nonzero(array == 100)
NotIncluding100s = array.argsort()[::-1][NumOf100s:NumOf100s+n]
print(NotIncluding100s)
array([64, 16, 14, 63, 53, 65, 56, 22, 13, 23])

你试过什么?那么等值呢?请提供您的尝试,并解释什么在it错误/输出与预期输出中不起作用,否则这看起来像是为我做家庭作业,我们不会这样做。抱歉,我不知道我应该记录我的所有尝试。我实际上能够解决这个问题后,立即张贴此!很抱歉给你带来了困惑。
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
NumOf100s = np.count_nonzero(array == 100)
NotIncluding100s = array.argsort()[::-1][NumOf100s:NumOf100s+n]
print(NotIncluding100s)
array([64, 16, 14, 63, 53, 65, 56, 22, 13, 23])