【问题标题】:Quickest way to find the nth largest value in a numpy Matrix在 numpy 矩阵中找到第 n 个最大值的最快方法
【发布时间】:2015-10-17 00:21:03
【问题描述】:

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

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

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

【问题讨论】:

标签: python numpy


【解决方案1】:

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

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

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

【讨论】:

  • @YanKingYin:是的,最优排序(例如归并排序)需要O(n log(n))
  • > should return the 2nd largest element — 是真的吗?来自documentationThe ordering of the elements in the two partitions is undefined.
  • @diraria:完全正确。唯一固定的位置是第二个位置。左侧和右侧的分区总是越来越小,但无序。
  • 这个解决方案意味着数字是唯一的。如果有重复,则不会返回所需的第二大数字(取决于您的需要)。
  • @laorient:是的,但即使删除重复项也会让您达到O(n) 运行时间,对吧?
【解决方案2】:

你可以flatten矩阵然后排序:

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

【讨论】:

  • np.partition 可能更快 - 它进行部分排序,足以将数组分成两部分。
  • 如果他想抓取多个元素,比如第二大、第三大等,这种方法可能会更好,因为除了索引之外没有其他操作,它们都可用。
  • numpy 中是否有一种有效的方法可以在不使用数组的情况下执行此操作?
  • @AaronLelevier 当然,使用np.sort,它返回一个排序的数组而不是数组方法,它将其展平:sorted_flat = np.sort(flat)
【解决方案3】:

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

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

为第二大

【讨论】:

    【解决方案4】:
    nums = [[ 35,  48,  63],
            [ 60,  77,  96],
            [ 91, 112, 135]]
    
    highs = [max(lst) for lst in nums]
    highs[nth]
    

    【讨论】:

    • 请添加一些关于您是如何实现这一目标的信息。不仅仅是代码。
    • 1. for 循环返回嵌套列表 2. max() 函数从嵌套列表返回高数并附加在高数内 3. 和 highs[nth] - 返回高数取决于索引
    【解决方案5】:
    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]])
    

    【讨论】:

    • 感谢您的贡献。如果您解释您的想法,您的答案可能会更有用。
    • 请检查arsort语法
    【解决方案6】:

    当重复元素出现在手头的数组中时,另一种方法是这样做。 如果我们有类似

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

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

    或者,可以使用以下 sn-p:

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

    首先,展平矩阵,然后只留下唯一元素,然后返回可变列表,对其进行排序并取第二个元素。即使数组中有重复元素,这也应该返回倒数第二大的元素。

    【讨论】:

      猜你喜欢
      • 2015-06-24
      • 2021-11-25
      • 2021-11-26
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多