Python 我需要一个numpy数组中的N个最小(索引)值
嗨,我有一个数组,里面有X个值,我想找到十个最小值的索引。在这一环节,他们有效地计算出了最大值, 然而,我还不能评论链接,所以我不得不重新发布这个问题 我不确定需要更改哪些索引才能达到最小值而不是最大值。 这是他们的密码Python 我需要一个numpy数组中的N个最小(索引)值,python,arrays,numpy,minimum,Python,Arrays,Numpy,Minimum,嗨,我有一个数组,里面有X个值,我想找到十个最小值的索引。在这一环节,他们有效地计算出了最大值, 然而,我还不能评论链接,所以我不得不重新发布这个问题 我不确定需要更改哪些索引才能达到最小值而不是最大值。 这是他们的密码 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]) 如果你打电话 arr
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])
如果你打电话
arr.argsort()[:3]
它将为您提供3个最小元素的索引
array([0, 2, 1], dtype=int64)
因此,对于n
,您应该调用
arr.argsort()[:n]
我不能保证这会更快,但更好的算法将依赖于
heapq
import heapq
indices = heapq.nsmallest(10,np.nditer(arr),key=arr.__getitem__)
这应该适用于大约
O(N)
操作,而使用argsort
则需要O(NlogN)
操作。但是,另一个被推到高度优化的C中,因此它的性能可能仍然更好。要确定这一点,您需要对实际数据运行一些测试。只是不要反转排序结果
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])
自从这个问题发布以来,numpy已经更新,包含了一种使用从数组中选择最小元素的更快方法。它最初包含在Numpy 1.8中 作为灵感,我们可以快速找到
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)上运行,因为排序发生在较小的
输出列表。此代码在
two\u maximum
中保存split\u列表的最大元素的20个索引:
Twenty_Maximum = split_list.argsort()[-20:]
Twenty_Minimum = split_list.argsort()[:20]
根据此代码,在two\u minimum
中保存split\u列表的最小元素的20个索引:
Twenty_Maximum = split_list.argsort()[-20:]
Twenty_Minimum = split_list.argsort()[:20]
哦,是的,这也行。我以前尝试过使用它,但遗漏了一些,它变得有点复杂,但现在可以使用了,谢谢:]对我来说也可以。然而,在我的例子中,它比纯numpy解决方案慢大约20倍