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

时间:2015-10-17 00:21:04

标签: python numpy

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

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

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

6 个答案:

答案 0 :(得分:20)

作为saidnp.partition应该更快(最多O(n)运行时间):

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

应该返回第二大元素。 (partition保证编号元素在位,前面的所有元素都更小,后面的所有元素都更大。)

答案 1 :(得分:10)

您可以Command line tool to query HTML elements矩阵然后对其进行排序:

>>> 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

答案 2 :(得分:0)

build/python

答案 3 :(得分:0)

手头的数组中出现重复元素时的另一种方法。 如果我们有

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

然后第二大元素将是3,而不是1。

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

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

首先,将矩阵展平,然后仅保留唯一元素,然后返回可变列表,对其进行排序,然后获取第二个元素。即使数组中有重复的元素,这也应从末尾返回第二大元素。

答案 4 :(得分:0)

<div class="container" id="containerTimeLine">

  <ul class="bigger highlight-active">
    <li onclick="PlayAudios();"></li>
    <!-- class="active" -->
    <li class="video"></li>
    <li class="question"></li>
    <li class="question"></li>
    <li class="question"></li>
    <li class="question"></li>
    <li></li>
  </ul>

</div>

答案 5 :(得分:0)

使用“独特”功能是一种非常干净的方法,但可能不是最快的方法:

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

第二大