如何查找numpy.ndarray中最后一次出现的最大值

如何查找numpy.ndarray中最后一次出现的最大值,numpy,scipy,Numpy,Scipy,我有一个numpy.ndarray,其中最大值通常会出现多次 编辑:这与作者所说的略有不同 或者,更好的是,是否可以获得数组中所有出现的最大值的索引列表 而在我的情况下,得到这样一份清单可能会非常昂贵 是否可以使用类似于numpy.argmax的方法来查找上一次出现的最大值的索引?我只想找到最后一个事件的索引,而不是所有事件的数组(因为可能有几百个) 例如,这将返回第一次出现的索引ie 2 import numpy as np a=np.array([0,0,4,4,4,4,2,2,2,2])

我有一个numpy.ndarray,其中最大值通常会出现多次

编辑:这与作者所说的略有不同

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

而在我的情况下,得到这样一份清单可能会非常昂贵

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

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

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

但是我希望它输出5。

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不复制数组,而是创建一个原始数组的视图,其中包含一个以相反顺序访问它的数组

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

如果数组由整数组成且行数少于1e15。您还可以通过添加一个“噪波”(noise)函数来对其进行排序,该函数将线性增加以后出现的值

>>>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

是否没有获取最后一次出现的索引的等效函数?另外,反转数组不是一个O(n)操作,更不用说加倍内存使用了吗?因为反转视图非常有效,所以有另一个函数值得怀疑。作者的可能副本需要所有事件的索引,以及那里给出的解决方案
occurrences=np。其中(a==a.max())
将生成一个包含所有最大值的数组,这在我的情况下可能非常昂贵。虽然答案只说明了如何获取所有出现的情况,但提问者要求两者都有,因此“可能重复”而不是“重复”。这可能比接受的答案更容易验证,但它需要额外的内存,速度要慢得多(在大小为1e6时很明显),而Sudarshan要求性能。通过添加
np.linspace(0.,.9,num=len(a),dtype='float32')
而不是
np.array(range(len(a))*1e-15
,它获得了10倍,但仍然比公认的解决方案慢了5倍。