如何评估多维数组中的N个最大元素?

时间:2012-04-13 19:35:00

标签: 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

3 个答案:

答案 0 :(得分:2)

最简单的方法是排序然后使用最后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])

答案 1 :(得分:0)

完全不需要排序。您可以在数组的负数上使用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 )时间。

答案 2 :(得分:-1)

对于reverse-sort数组来说,最有效的方法是采用第一个N元素:

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

如果要查找多维数组中的最大元素,请使用a.ravel()展开单个维度

如上所述,这实际上并不使用numpy,但你可以使用np.sort做类似的事情,尽管你必须自己扭转它,例如,通过使用[::-1]索引,给出相当巴洛克式的

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