Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我需要一个numpy数组中的N个最小(索引)值_Python_Arrays_Numpy_Minimum - Fatal编程技术网

Python 我需要一个numpy数组中的N个最小(索引)值

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

嗨,我有一个数组,里面有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.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倍