【发布时间】: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
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
最简单的方法是排序,然后使用最后的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])
【讨论】:
heapq 模块也会比上面的代码慢得多。您对如何改进此代码有任何实用的建议吗?
完全排序是不必要的。您可以在数组的负数上使用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) 时间。
【讨论】:
reverse-sort 您的数组并获取第一个 N 元素可能是最有效的:
a = [1,2,3]
sorted(a, reverse=True)[:2]
如果您想在多维数组中找到最大的元素,请使用a.ravel(),它展开为一维
正如所写,这实际上并不使用 numpy,但您可以使用 np.sort 做类似的事情,尽管您必须自己反转它,例如,通过使用 [::-1] 进行索引,给出相当巴洛克风格的外观
np.sort(a.ravel())[::-1][:2]
【讨论】: