31

嗨,我有一个包含 X 个值的数组,我想找到十个最小值的索引。在此链接中,他们有效地计算了最大值,如何在 numpy 数组中获取 N 个最大值的索引? 但是我还不能对链接发表评论,所以我不得不重新发布这个问题。

我不确定我需要更改哪些指标才能达到最小值而不是最大值。这是他们的代码

In [1]: import numpy as np

In [2]: arr = np.array([1, 3, 2, 4, 5])

In [3]: arr.argsort()[-3:][::-1]
Out[3]: array([4, 3, 1]) 
4

5 回答 5

50

如果你打电话

arr.argsort()[:3]

它将为您提供 3 个最小元素的索引。

array([0, 2, 1], dtype=int64)

所以,对于n,你应该打电话

arr.argsort()[:n]
于 2013-05-29T15:28:12.413 回答
25

自从发布此问题以来,numpy 已更新为包含使用argpartition. 它首先包含在 Numpy 1.8 中。

snarly 的回答为灵感,我们可以快速找到k=3最小的元素:

In [1]: import numpy as np

In [2]: arr = np.array([1, 3, 2, 4, 5])

In [3]: k = 3

In [4]: ind = np.argpartition(arr, k)[:k]

In [5]: ind
Out[5]: array([0, 2, 1])

In [6]: arr[ind]
Out[6]: array([1, 2, 3])

这将在 O(n) 时间内运行,因为它不需要进行完整排序。如果您需要对答案进行排序(注意:在这种情况下,输出数组是按排序顺序排列的,但不能保证),您可以对输出进行排序:

In [7]: sorted(arr[ind])
Out[7]: array([1, 2, 3])

这在 O(n + k log k) 上运行,因为排序发生在较小的输出列表上。

于 2016-03-08T19:26:18.907 回答
8

我不保证这会更快,但更好的算法将依赖heapq.

import heapq
indices = heapq.nsmallest(10,np.nditer(arr),key=arr.__getitem__)

这应该在近似O(N)操作中起作用,而使用argsort会进行O(NlogN)操作。但是,另一个被推到高度优化的 C 中,所以它可能仍然表现更好。要确定,您需要对实际数据进行一些测试。

于 2013-05-29T15:31:24.867 回答
3

只是不要反转排序结果。

In [164]: a = numpy.random.random(20)

In [165]: a
Out[165]: 
array([ 0.63261763,  0.01718228,  0.42679479,  0.04449562,  0.19160089,
        0.29653725,  0.93946388,  0.39915215,  0.56751034,  0.33210873,
        0.17521395,  0.49573607,  0.84587652,  0.73638224,  0.36303797,
        0.2150837 ,  0.51665416,  0.47111993,  0.79984964,  0.89231776])

排序:

In [166]: a.argsort()
Out[166]: 
array([ 1,  3, 10,  4, 15,  5,  9, 14,  7,  2, 17, 11, 16,  8,  0, 13, 18,
       12, 19,  6])

前十名:

In [168]: a.argsort()[:10]
Out[168]: array([ 1,  3, 10,  4, 15,  5,  9, 14,  7,  2])
于 2013-05-29T15:33:00.553 回答
1

split_list这段代码保存了in的最大元素的 20 个索引Twenty_Maximum

Twenty_Maximum = split_list.argsort()[-20:]

针对此代码保存 20 的最小元素索引split_listin Twenty_Minimum

Twenty_Minimum = split_list.argsort()[:20]
于 2019-11-11T22:35:03.473 回答