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