如何在整个numpy矩阵中获得最大(顶部)N值

时间:2018-05-28 03:39:00

标签: python sorting numpy matrix

我想获得前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功能来做到这一点!

3 个答案:

答案 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)

一种方法可能是使用flattensorted以及切片顶部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]