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

the*_*cks 16 python numpy

对于单个阵列,有很多解决方案可以做到这一点,但是矩阵怎么样,例如:

>>> k
array([[ 35,  48,  63],
       [ 60,  77,  96],
       [ 91, 112, 135]])
Run Code Online (Sandbox Code Playgroud)

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

ser*_*inc 25

至于,np.partition应该快了(最多O(n)的运行时间):

np.partition(k.flatten(), -2)[-2]
Run Code Online (Sandbox Code Playgroud)

应该返回第二大元素.(partition保证编号元素处于适当位置,之前的所有元素都较小,后面的所有元素都较大).

  • @diraria:正是。唯一固定的位置是第二个位置。左右分区总是越来越小,但无序。 (3认同)
  • 该解决方案意味着数字是唯一的。如果有重复项,那么它将不会返回所需的第二大数字(取决于您的需要)。 (2认同)

rof*_*fls 12

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

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • `np.partition`可能更快 - 它进行了部分排序,足以将数组分成2部分. (6认同)

Alb*_*o A 7

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

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

对于第二大的