使用NumPy查找数组中的最大值索引

时间:2014-02-24 13:41:27

标签: python arrays numpy max

我想在float64数组中找到最大值,不包括nan值。

我看到np.nanmax函数,但它没有给出与找到的值对应的索引。

特别是扫描到值后该函数必然使用索引才很奇怪???这样搜索不是一个错误。

是否有办法直接恢复索引?

3 个答案:

答案 0 :(得分:16)

Numpy有一个argmax函数可以返回,尽管你必须手动处理nannan总是被排序到数组的末尾,因此请记住:

a = np.random.rand(10000)
a[np.random.randint(10000, size=(10,))] = np.nan
a = a.reshape(100, 100)

def nanargmax(a):
    idx = np.argmax(a, axis=None)
    multi_idx = np.unravel_index(idx, a.shape)
    if np.isnan(a[multi_idx]):
        nan_count = np.sum(np.isnan(a))
        # In numpy < 1.8 use idx = np.argsort(a, axis=None)[-nan_count-1]
        idx = np.argpartition(a, -nan_count-1, axis=None)[-nan_count-1]
        multi_idx = np.unravel_index(idx, a.shape)
    return multi_idx

>>> nanargmax(a)
(20, 93)

答案 1 :(得分:6)

您应该使用np.where

In [17]: a=np.random.uniform(0, 10, size=10)

In [18]: a
Out[18]: 
array([ 1.43249468,  4.93950873,  7.22094395,  1.20248629,  4.66783985,
        6.17578054,  4.6542771 ,  7.09244492,  7.58580515,  5.72501954])

In [20]: np.where(a==a.max())
Out[20]: (array([8]),)

这也适用于2个数组,返回值是索引。 这里我们创建一个从1到9的范围:

 x = np.arange(9.).reshape(3, 3)

这将返回等于5的项目的索引:

In [34]: np.where(x == 5)
Out[34]: (array([1]), array([2])) # the first one is the row index, the second is the column

您可以直接使用此值来切割数组:

In [35]: x[np.where(x == 5)]
Out[35]: array([ 5.])

答案 2 :(得分:3)

您想使用numpy.nanargmax

文档提供了一些明确的示例。

a = np.array([[np.nan, 4], [2, 3]])
print np.argmax(a)
0

print np.nanargmax(a)
1

np.nanargmax(a, axis=0)
array([1, 0])

np.nanargmax(a, axis=1)
array([1, 1])