【发布时间】:2015-10-17 00:21:03
【问题描述】:
对于单个数组有很多解决方案,但是矩阵呢,例如:
>>> k
array([[ 35, 48, 63],
[ 60, 77, 96],
[ 91, 112, 135]])
您可以使用k.max(),但当然这只会返回最大值135。如果我想要第二个或第三个怎么办?
【问题讨论】:
对于单个数组有很多解决方案,但是矩阵呢,例如:
>>> k
array([[ 35, 48, 63],
[ 60, 77, 96],
[ 91, 112, 135]])
您可以使用k.max(),但当然这只会返回最大值135。如果我想要第二个或第三个怎么办?
【问题讨论】:
作为said,np.partition 应该更快(最多 O(n) 运行时间):
np.partition(k.flatten(), -2)[-2]
应该返回第二大元素。 (partition保证编号元素就位,前面的元素都小,后面的都大)。
【讨论】:
O(n log(n))
should return the 2nd largest element — 是真的吗?来自documentation:The ordering of the elements in the two partitions is undefined.
O(n) 运行时间,对吧?
你可以flatten矩阵然后排序:
>>> 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
【讨论】:
np.partition 可能更快 - 它进行部分排序,足以将数组分成两部分。
numpy 中是否有一种有效的方法可以在不使用数组的情况下执行此操作?
np.sort,它返回一个排序的数组而不是数组方法,它将其展平:sorted_flat = np.sort(flat)
使用“独特”功能是一种非常简洁的方法,但可能不是最快的:
k = array([[ 35, 48, 63],
[ 60, 77, 96],
[ 91, 112, 135]])
i = numpy.unique(k)[-2]
为第二大
【讨论】:
nums = [[ 35, 48, 63],
[ 60, 77, 96],
[ 91, 112, 135]]
highs = [max(lst) for lst in nums]
highs[nth]
【讨论】:
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]])
【讨论】:
arsort语法
当重复元素出现在手头的数组中时,另一种方法是这样做。 如果我们有类似
a = np.array([[1,1],[3,4]])
那么第二大元素将是 3,而不是 1。
或者,可以使用以下 sn-p:
second_largest = sorted(list(set(a.flatten().tolist())))[-2]
首先,展平矩阵,然后只留下唯一元素,然后返回可变列表,对其进行排序并取第二个元素。即使数组中有重复元素,这也应该返回倒数第二大的元素。
【讨论】: