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

fro*_*ggy 13 python arrays numpy max

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

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

特别是函数必须使用索引后扫描后很奇怪??? 这样搜索不是一个错误.

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

Jai*_*ime 16

Numpy有一个argmax函数可以返回,尽管你必须nan手动处理.nan总是被排序到数组的末尾,所以考虑到这一点,你可以这样做:

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)
Run Code Online (Sandbox Code Playgroud)

  • 实际上,我刚刚检查过,numpy 有一个 [`np.nanargmax`](http://docs.scipy.org/doc/numpy/reference/ generated/numpy.nanargmax.html) 这可能就是你应该使用的。 (2认同)

Oz1*_*123 7

你应该用 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]),)
Run Code Online (Sandbox Code Playgroud)

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

 x = np.arange(9.).reshape(3, 3)
Run Code Online (Sandbox Code Playgroud)

这将返回等于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
Run Code Online (Sandbox Code Playgroud)

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

In [35]: x[np.where(x == 5)]
Out[35]: array([ 5.])
Run Code Online (Sandbox Code Playgroud)