我想获得前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功能来做到这一点!
解决方法:
为此目的,使用numpy.partition()
比执行完全排序要快得多:
np.partition(np.asarray(mat), mat.size - N, axis=None)[-N:]
假设N <=尺寸.
如果您还需要对最终结果进行排序(除了前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]