【问题标题】:How to evaluate N largest elements in a multidimensional array?如何评估多维数组中的 N 个最大元素?
【发布时间】:2012-04-13 19:34:59
【问题描述】:

numpy 可以评估多维数组中的 N 个最大元素吗? 说:

import numpy as np
a=[1,2,3]
b=a.max(num_of_max_elements=2) #I know it won't work, and I want it to be 2 and 3

【问题讨论】:

    标签: python arrays sorting numpy


    【解决方案1】:

    最简单的方法是排序,然后使用最后的n 数字。这也可以在不更改原始数组的情况下完成。下面是一个如何在 10x10 数组中查找最大 10 个数字的示例:

    a = numpy.random.randint(1000, size=100).reshape(10, 10)
    indices = a.ravel().argsort()
    print a.ravel()[indices[-10:]]
    

    这段代码打印出类似的东西

    array([909, 917, 926, 936, 952, 960, 961, 964, 969, 993])
    

    【讨论】:

    • 这是 O(n log n) 虽然与 O(n log k) 相比(其中 k 是要返回的项目数)对于明显的实现(虽然不知道如何在 numpy 中得到它)。如果我们不能更改数组,那么它也是 O(n) 与 O(k) wrt 内存。
    • @Voo:使用堆队列是您所说的“显而易见的解决方案”吗? NumPy 中没有堆实现,即使对于非常大的数组,Python 的heapq 模块也会比上面的代码慢得多。您对如何改进此代码有任何实用的建议吗?
    • 我应该说明显的“算法”对不起。正如我所说,我看不到任何方法可以在 numpy 本身中有效地实现这一点。我认为针对该问题编写一个特定的 c 扩展是可行的,但要做到这一点并不简单。这在很大程度上取决于 n 和 k 的大小如何帮助我们。如果简单的排序解决方案足够好,那就去吧。
    • @voo:这就是为什么我以“最简单的方法……”开始我的回答的原因。最快的方法会有所不同。
    • 是的,我只是想指出,理论上这比最佳解决方案效率低大约 log n 倍,我认为应该在那里提及。
    【解决方案2】:

    完全排序是不必要的。您可以在数组的负数上使用np.partition,切片前 n 个元素,然后取负数来反转初始转换。

    如果您提供axis=None,则数组在排序前会被展平。

    np.random.seed(0)
    
    a = np.random.randint(1000, size=100).reshape(10, 10)
    
    res = -np.partition(-a, kth=10, axis=None)[:10]
    # array([961, 999, 932, 937, 976, 916, 984, 910, 908, 901])
    

    或者,您可以指定否定kth

    res = np.partition(a, kth=-10, axis=None)[-10:]
    # array([901, 908, 910, 916, 984, 932, 937, 999, 961, 976])
    

    没有为np.partition 指定排序。在最坏的情况下,该解决方案需要 O(n) 时间。

    【讨论】:

      【解决方案3】:

      reverse-sort 您的数组并获取第一个 N 元素可能是最有效的:

       a = [1,2,3]
       sorted(a, reverse=True)[:2]
      

      如果您想在多维数组中找到最大的元素,请使用a.ravel(),它展开为一维

      正如所写,这实际上并不使用 numpy,但您可以使用 np.sort 做类似的事情,尽管您必须自己反转它,例如,通过使用 [::-1] 进行索引,给出相当巴洛克风格的外观

      np.sort(a.ravel())[::-1][:2]
      

      【讨论】:

      • 从标题来看,我认为OP希望将其应用于多维NumPy数组。
      猜你喜欢
      • 2020-08-09
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多