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
最简单的方法是排序,然后使用最后的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])
完全排序是不必要的。您可以在数组的负数上使用,对前n 个np.partition
元素进行切片,然后取负数来反转初始转换。
如果您提供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 ) 时间。
对数组进行反向排序并获取第一个N
元素可能是最有效的:
a = [1,2,3]
sorted(a, reverse=True)[:2]
如果要查找多维数组中的最大元素,请使用a.ravel()
展开到一维的
正如所写,这实际上并没有使用 numpy,但是您可以使用 执行类似的操作np.sort
,尽管您必须自己反转它,例如,通过使用 索引[::-1]
,给出相当巴洛克式的外观
np.sort(a.ravel())[::-1][:2]