Подтвердить что ты не робот

Поиск индекса максимального значения в массиве с NumPy

Я хотел бы найти максимум в массиве float64, исключая значения nan.

Я видел функцию np.nanmax, но она не дает индекс, соответствующий найденному значению.

довольно странно сканировать после того, как значение специально функция обязательно использует индекс??? Разве это не ошибка, подобная этой ошибке.

нет способа восстановить индекс напрямую?

4b9b3361

Ответ 1

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

Ответ 2

Вы должны использовать 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.])

Ответ 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])