我想获得前N(最大)args&整个numpy矩阵的值,而不是单个维度(行/列)。
示例输入(带N=3
):
import numpy as np
mat = np.matrix([[9,8, 1, 2], [3, 7, 2, 5], [0, 3, 6, 2], [0, 2, 1, 5]])
print(mat)
[[9 8 1 2]
[3 7 2 5]
[0 3 6 2]
[0 2 1 5]]
所需的输出:[9, 8, 7]
由于max在单个维度上不可传递,因此按行或列进行操作不起作用。
# by rows, no 8
np.squeeze(np.asarray(mat.max(1).reshape(-1)))[:3]
array([9, 7, 6])
# by cols, no 7
np.squeeze(np.asarray(mat.max(0)))[:3]
array([9, 8, 6])
我的代码有效,但看起来真的很笨重。
# reshape into single vector
mat_as_vector = np.squeeze(np.asarray(mat.reshape(-1)))
# get top 3 arg positions
top3_args = mat_as_vector.argsort()[::-1][:3]
# subset the reshaped matrix
top3_vals = mat_as_vector[top3_args]
print(top3_vals)
array([9, 8, 7])
会欣赏任何更短的方式/更有效的方式/魔法numpy功能来做到这一点!
答案 0 :(得分:4)
使用numpy.partition()
比为此目的执行完全排序要快得多:
np.partition(np.asarray(mat), mat.size - N, axis=None)[-N:]
假设N<=mat.size
。
如果您需要对最终结果进行排序(除了顶部N
),那么您需要对先前的结果进行排序(但可能您将排序比原始结果更小的数组):
np.sort(np.partition(np.asarray(mat), mat.size - N, axis=None)[-N:])
如果您需要从最大到最低排序的结果,请将[::-1]
后挂起到上一个命令:
np.sort(np.partition(np.asarray(mat), mat.size - N, axis=None)[-N:])[::-1]
答案 1 :(得分:3)
一种方法可能是使用flatten
和sorted
以及切片顶部n
值:
sorted(mat.flatten().tolist()[0], reverse=True)[:3]
结果:
[9, 8, 7]
答案 2 :(得分:-4)
这个想法来自这个答案:How to get indices of N maximum values in a numpy array?
import numpy as np
import heapq
mat = np.matrix([[9,8, 1, 2], [3, 7, 2, 5], [0, 3, 6, 2], [0, 2, 1, 5]])
ind = heapq.nlargest(3, range(mat.size), mat.take)
print(mat.take(ind).tolist()[0])
<强>输出强>
[9, 8, 7]