2013-05-29 64 views
10

您好我有一个数组中有X个值的数组我想定位十个最小值的索引。在这个链接他们计算了最大有效,How to get indices of N maximum values in a numpy array? 但是我不能评论链接,所以我不得不重新发布这个问题。我需要在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]) 

回答

22

如果你打电话

arr.argsort()[:3] 

它会给你3种最小元素的索引。

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

所以,n,你应该叫

arr.argsort()[:n] 
5

我不保证,这将是快,但更好的算法将依靠heapq

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

这应该工作在大约O(N)操作,而使用argsort将采取O(NlogN)操作。然而,另一个被推入高度优化的C,所以它可能仍然表现更好。要知道,你需要对你的实际数据进行一些测试。

+0

o是的,这也适用。我之前尝试过使用它,但错过了一些,它有点复杂,但现在可以使用,谢谢:] – astrochris

+0

适用于我。但是,在我的情况下,它比纯numpy解决方案慢大约20倍 – embert

+0

我不认为它适用于浮动。 – darshan

2

只是不要颠倒排序结果。

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.873, 
     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]) 

首先10:

In [168]: a.argsort()[:10] 
Out[168]: array([ 1, 3, 10, 4, 15, 5, 9, 14, 7, 2]) 
10

由于这个问题被张贴,numpy的已更新,包括从使用argpartition一个阵列中选择最小的元件的更快的方式。它首次被包含在Numpy 1.8中。

使用snarly's answer为灵感,我们可以很快找到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 1o9氏),因为排序发生在较小的 输出列表上。

相关问题