在 numpy 矩阵中找到第 n 个最大值的最快方法

问题描述 投票:0回答:7

对于单个数组有很多解决方案,但是对于矩阵呢,例如:

>>> k
array([[ 35,  48,  63],
       [ 60,  77,  96],
       [ 91, 112, 135]])

您可以使用

k.max()
,但当然这只会返回最高值,
135
。如果我想要第二个或第三个怎么办?

python numpy
7个回答
66
投票

正如所说

np.partition
应该更快(至多O(n)运行时间):

np.partition(k.flatten(), -2)[-2]

应该返回第二大元素。 (

partition
保证编号元素就位,前面的元素都较小,后面的元素都较大)。


29
投票

您可以展平矩阵,然后对其进行排序:

>>> k = np.array([[ 35,  48,  63],
...        [ 60,  77,  96],
...        [ 91, 112, 135]])
>>> flat=k.flatten()
>>> flat.sort()
>>> flat
array([ 35,  48,  60,  63,  77,  91,  96, 112, 135])
>>> flat[-2]
112
>>> flat[-3]
96

7
投票

使用“unique”函数是一种非常干净的方法,但可能不是最快的:

k = array([[ 35,  48,  63],
           [ 60,  77,  96],
           [ 91, 112, 135]])
i = numpy.unique(k)[-2]

第二大


0
投票
import numpy as np
a=np.array([[1,2,3],[4,5,6]])
a=a.reshape((a.shape[0])*(a.shape[1]))  # n is the nth largest taken by us
print(a[np.argsort()[-n]])

0
投票

当重复元素出现在手边的数组中时,另一种方法可以实现这一点。 如果我们有类似的东西

a = np.array([[1,1],[3,4]])

那么第二大元素将是 3,而不是 1。

或者,可以使用以下代码片段:

second_largest = sorted(list(set(a.flatten().tolist())))[-2]

首先,压平矩阵,然后只留下唯一元素,然后回到可变列表,对其进行排序并取出第二个元素。即使数组中存在重复元素,这也应该返回从末尾算起的第二大元素。


0
投票
nums = [[ 35,  48,  63],
        [ 60,  77,  96],
        [ 91, 112, 135]]

highs = [max(lst) for lst in nums]
highs[nth]

0
投票

要获取数组(my_array)中第二(或第n)大数的索引,您可以使用,

index_2 = np.argsort(my_array)[-2]

或者更一般地说,

index_n = np.argsort(my_array)[-n]

现在,要获取第 n 大元素的值,

nth_largest_val = my_array[index_n]
© www.soinside.com 2019 - 2024. All rights reserved.