当前位置: 首页 > 面试题库 >

在numpy数组中查找最大N个元素的快速方法

张丰
2023-03-14
问题内容

我知道我可以像下面这样:

import numpy as np
N=10
a=np.arange(1,100,1)
np.argsort()[-N:]

但是,由于它做了完整的排序,所以它非常慢。

我想知道numpy是否提供一些可以快速完成的方法。


问题答案:

bottleneck模块具有一种快速的局部排序方法,可直接与Numpy数组配合使用:bottleneck.partition()

请注意,bottleneck.partition()返回的是已排序的实际值,如果要使用已排序的值的索引(numpy.argsort()返回值),则应使用bottleneck.argpartition()

我已经进行了基准测试:

  • z = -bottleneck.partition(-a, 10)[:10]
  • z = a.argsort()[-10:]
  • z = heapq.nlargest(10, a)

其中a是一个随机的1,000,000个元素的数组。

时间安排如下:

  • bottleneck.partition():每个循环25.6毫秒
  • np.argsort():每个循环198毫秒
  • heapq.nlargest():每个循环358毫秒


 类似资料:
  • 问题内容: 我只需要找到1D中最小的第n个元素。 例如: 我想获得第五个最小的元素,所以我想要的输出是。 我当前的解决方案是这样的: 但是,找到5个最小的元素然后再选择最大的元素对我来说似乎很笨拙。有更好的方法吗?我是否缺少一个可以实现目标的功能? 有些问题的标题与此相似,但我没有看到任何答案。 编辑: 我本来应该提到它,但是性能对我来说很重要。因此,虽然不错的解决方案对我来说不起作用。 结果:

  • 问题 怎样从一个集合中获得最大或者最小的 N 个元素列表? 解决方案 heapq 模块有两个函数:nlargest() 和 nsmallest() 可以完美解决这个问题。 import heapq nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2] print(heapq.nlargest(3, nums)) # Prints [42, 37, 23] p

  • 问题内容: 想知道如何编写SQL函数以查找表中的第N个最大元素,如果没有第N个最大元素,则返回Null。 使用MySQL / MySQL工作台。 顺便说一句,我的问题与第N个最高薪水问题不同,因为我还有一个附加要求,如果第N个最大元素不存在,则返回Null。任何想法表示赞赏。 预先感谢林 问题答案: 您可以这样做:

  • 从提供的数组中返回 n 个最大元素。如果 n 大于或等于提供的数组长度,则返回原数组(按降序排列)。 结合使用Array.sort() 与展开操作符(...) ,创建一个数组的浅克隆,并按降序排列。 使用 Array.slice() 以获得指定的元素个数。 忽略第二个参数 n ,默认获取单个元素(以数组的形式)。 const maxN = (arr, n = 1) => [...arr].sort

  • 我需要找到高于指定阈值的的第一个和最后一个元素。我找到了以下解决方案,这是有效的,但它看起来有点令人费解。有没有更简单/更蟒蛇的方式?