我有一个从大型2d数组返回argmax的函数
getMax = np.argmax(dist, axis=1)
但是我想获得下一个最大的值,有没有办法从原始数组中删除getMax值然后再次执行argmax?
答案 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 loop
为top_n_1
,100 loops, best of 3: 8.06 ms per loop
为top_n_2
。
我希望这很有用。