ast*_*ris 19 python arrays numpy minimum
嗨,我有一个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])
Run Code Online (Sandbox Code Playgroud)
pet*_*hor 34
如果你打电话
arr.argsort()[:3]
Run Code Online (Sandbox Code Playgroud)
它将为您提供3个最小元素的索引.
array([0, 2, 1], dtype=int64)
Run Code Online (Sandbox Code Playgroud)
所以,因为n,你应该打电话
arr.argsort()[:n]
Run Code Online (Sandbox Code Playgroud)
Ale*_*lex 17
自从这个问题发布以来,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])
Run Code Online (Sandbox Code Playgroud)
这将在O(n)时间运行,因为它不需要进行完整排序.如果您需要对答案进行排序(注意:在这种情况下,输出数组按排序顺序但不保证)您可以对输出进行排序:
In [7]: sorted(arr[ind])
Out[7]: array([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)
这在O(n + k log k)上运行,因为排序发生在较小的输出列表上.
我不保证这会更快,但更好的算法将依赖heapq.
import heapq
indices = heapq.nsmallest(10,np.nditer(arr),key=arr.__getitem__)
Run Code Online (Sandbox Code Playgroud)
这应该在大约O(N)操作中起作用,而使用则argsort需要O(NlogN)操作.但是,另一个被推入高度优化的C,因此它可能仍然表现更好.要确切知道,您需要对实际数据进行一些测试.