对于单个数组有很多解决方案,但是对于矩阵呢,例如:
>>> k
array([[ 35, 48, 63],
[ 60, 77, 96],
[ 91, 112, 135]])
您可以使用
k.max()
,但当然这只会返回最高值,135
。如果我想要第二个或第三个怎么办?
正如所说,
np.partition
应该更快(至多O(n)运行时间):
np.partition(k.flatten(), -2)[-2]
应该返回第二大元素。 (
partition
保证编号元素就位,前面的元素都较小,后面的元素都较大)。
您可以展平矩阵,然后对其进行排序:
>>> k = np.array([[ 35, 48, 63],
... [ 60, 77, 96],
... [ 91, 112, 135]])
>>> flat=k.flatten()
>>> flat.sort()
>>> flat
array([ 35, 48, 60, 63, 77, 91, 96, 112, 135])
>>> flat[-2]
112
>>> flat[-3]
96
使用“unique”函数是一种非常干净的方法,但可能不是最快的:
k = array([[ 35, 48, 63],
[ 60, 77, 96],
[ 91, 112, 135]])
i = numpy.unique(k)[-2]
第二大
import numpy as np
a=np.array([[1,2,3],[4,5,6]])
a=a.reshape((a.shape[0])*(a.shape[1])) # n is the nth largest taken by us
print(a[np.argsort()[-n]])
当重复元素出现在手边的数组中时,另一种方法可以实现这一点。 如果我们有类似的东西
a = np.array([[1,1],[3,4]])
那么第二大元素将是 3,而不是 1。
或者,可以使用以下代码片段:
second_largest = sorted(list(set(a.flatten().tolist())))[-2]
首先,压平矩阵,然后只留下唯一元素,然后回到可变列表,对其进行排序并取出第二个元素。即使数组中存在重复元素,这也应该返回从末尾算起的第二大元素。
nums = [[ 35, 48, 63],
[ 60, 77, 96],
[ 91, 112, 135]]
highs = [max(lst) for lst in nums]
highs[nth]
要获取数组(my_array)中第二(或第n)大数的索引,您可以使用,
index_2 = np.argsort(my_array)[-2]
或者更一般地说,
index_n = np.argsort(my_array)[-n]
现在,要获取第 n 大元素的值,
nth_largest_val = my_array[index_n]