【问题标题】:How to find last occurrence of maximum value in a numpy.ndarray如何在 numpy.ndarray 中查找最大值的最后一次出现
【发布时间】:2012-01-07 09:05:37
【问题描述】:

我有一个 numpy.ndarray,其中的最大值大多会出现不止一次。

编辑:这与numpy.argmax: how to get the index corresponding to the *last* occurrence, in case of multiple occurrences of the maximum values 略有不同,因为作者说

或者,更好的是,是否可以获得数组中所有最大值出现的索引列表?

而在我的情况下,获得这样的清单可能会证明非常昂贵

是否可以使用numpy.argmax 之类的方法找到最后一次出现最大值的索引?我想只找到最后一次出现的索引,而不是所有出现的数组(因为可能有数百个)

例如,这将返回第一次出现的索引,即 2

import numpy as np
a=np.array([0,0,4,4,4,4,2,2,2,2])
print np.argmax(a)

但我希望它输出 5。

【问题讨论】:

标签: numpy scipy


【解决方案1】:

numpy.argmax 只返回第一次出现的索引。您可以将argmax 应用于数组的反向视图:

import numpy as np
a = np.array([0,0,4,4,4,4,2,2,2,2])
b = a[::-1]
i = len(b) - np.argmax(b) - 1
i     # 5
a[i:] # array([4, 2, 2, 2, 2])

注意 numpy 不会复制数组,而是使用stride 创建原始视图,以相反的顺序访问它。

id(a) == id(b.base) # True

【讨论】:

  • 没有等效的函数可以获取最后一次出现的索引吗?也不会反转数组是 O(n) 操作,更不用说内存使用量加倍了?
  • 怀疑还有另一个功能,因为反向视图非常有效。
【解决方案2】:

如果您的数组由整数组成并且行数少于 1e15。您还可以通过添加一个噪声函数来解决这个问题,该函数线性地增加后来出现的值。

>>>import numpy as np
>>>a=np.array([0,0,4,4,4,4,2,2,2,2])
>>>noise= np.array(range(len(a))) * 1e-15
>>>print(np.argmax(a + noise))
5

【讨论】:

  • 这可能比接受的答案更容易验证,但它需要额外的内存并且速度要慢得多(在大小 1e6 时很明显),而 Sudarshan 要求性能。
  • 通过添加 np.linspace(0., .9, num=len(a), dtype='float32') 而不是 np.array(range(len(a)))*1e-15,它获得了 10 倍,但仍然比公认的解决方案慢 5 倍。
猜你喜欢
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多