【问题标题】:Next argmax values in pythonpython中的下一个argmax值
【发布时间】:2014-12-14 20:17:43
【问题描述】:

我有一个从大型二维数组返回 argmax 的函数

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

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

【问题讨论】:

  • 如果您不仅需要第二大元素,还可能需要第三大元素,以此类推,以下内容可能会有所帮助:stackoverflow.com/questions/16878715/…
  • 您真的要删除最大的,还是只想找到下一个最大的?
  • @Joel 找到下一个最大的
  • 检查我的答案 --- 我现在使用的计算机上没有 numpy,所以无法检查错误
  • @Joel 很抱歉,我无法更改我需要的订单

标签: python


【解决方案1】:

使用命令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])

【讨论】:

  • 对不起,订单很重要,我不能更改订单
  • 我想你误会了。排序np.argsort(dist) 给出了从最小位置到最大位置的位置列表。所以np.argsort(-dist) 给出了-dist 从最小到最大的位置列表。所以它是dist 从最大到最小的位置。它不会以任何方式改变dist 的顺序。
  • 我刚刚意识到这一点,但是当我使用它时,它会返回一个充满零的数组,而不是它应该返回的数组
  • 您能否编辑您的问题以给出一个最小示例和预期输出?
  • 我已经解决了,是后面代码出错了。谢谢乔尔!
【解决方案2】:

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

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

import numpy as np 

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

top_n_1 = l[np.argsort(-l)[0:n]]
top_n_2 = l[np.argpartition(l, -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

我希望这是有用的。

【讨论】:

    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多