接下来是python中的argmax值

时间:2014-12-14 20:17:43

标签: python

我有一个从大型2d数组返回argmax的函数

getMax = np.argmax(dist, axis=1)

但是我想获得下一个最大的值,有没有办法从原始数组中删除getMax值然后再次执行argmax?

2 个答案:

答案 0 :(得分:9)

使用命令np.argsort(a, axis=-1, kind='quicksort', order=None),但选择适当的参数(如下)。

这是documentation。注意“它以排序的顺序返回一个与给定轴上的索引数据形状相同的索引数组。”

默认顺序从小到大。所以用-dist排序(用于快速编码)。警告:执行-dist会导致生成一个新数组,如果dist很大,您可能会关心它。请参阅帖子的底部,以获得更好的替代方案。

以下是一个例子:

x = np.array([[1,2,5,0],[5,7,2,3]])
L = np.argsort(-x, axis=1)

print L
[[2 1 0 3]
 [1 0 3 2]]

x  
array([[1, 2, 5, 0],
   [5, 7, 2, 3]])

因此,L行中的第n个条目给出x的第n个最大元素的位置。

x没有变化。

L[:,0]将提供与np.argmax(x)

相同的输出
L[:,0]
array([2, 1])

np.argmax(x,axis=1)
array([2, 1])

L[:,1]会提供与假设的argsecondmax(x)

相同的内容
L[:,1]
array([1, 0])

如果您不想生成新列表,那么您不想使用-x

L = np.argsort(x, axis=1)

print L
[[3 0 1 2]
 [2 3 0 1]]

L[:,-1]
array([2, 1])

L[:,-2]
array([1, 0])

答案 1 :(得分:0)

如果速度对您很重要,使用argpartition而不是argsort可能很有用。

例如,要从列表中返回n个最大元素:

import numpy as np 

list = np.random.random_integer(0, 100, 1e6)

top_n_1 = list[np.argsort(-list)[0:n]]
top_n_2 = list[np.argpartition(list, -n)[-n:]]

ipython报告中的%timeit函数 10 loops, best of 3: 56.9 ms per looptop_n_1100 loops, best of 3: 8.06 ms per looptop_n_2

我希望这很有用。