Поиск индекса максимального значения в массиве с NumPy
Я хотел бы найти максимум в массиве float64
, исключая значения nan
.
Я видел функцию np.nanmax
, но она не дает индекс, соответствующий найденному значению.
довольно странно сканировать после того, как значение специально функция обязательно использует индекс??? Разве это не ошибка, подобная этой ошибке.
нет способа восстановить индекс напрямую?
Ответы
Ответ 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])