Как установить первое значение в массиве numpy, которое соответствует условию 1, но не остальные - PullRequest
3 голосов
/ 17 февраля 2020

Я хочу установить максимальное значение в массиве numpy равным 1, а остальным значениям - 0, чтобы в новом массиве было только одно значение, равное 1.

Прямо сейчас я делаю это с:

new_arr = np.where(arr == np.max(arr), 1, 0)

Однако, если в arr есть несколько значений, равных np.max(arr), в new_arr будет несколько значений, равных 1. Как сделать так, чтобы в new_arr было только одно значение, равное 1 (первое значение, равное np.max(arr), кажется хорошим вариантом, но не обязательным).

Ответы [ 2 ]

2 голосов
/ 17 февраля 2020

У вас это почти есть.

Это даст вам индекс последнего вхождения максимального значения

np.where(arr == np.max(arr))[0][-1]

, и если вы хотите первое вхождение максимального значения, оно это:

np.where(arr == np.max(arr))[0][0]

Пример

import numpy as np

arr = np.array(np.random.choice([1, 2, 3, 4], size=10))
print(arr)

Output : [4 1 2 4 1 1 4 2 4 3]

Тогда:

np.where(arr == np.max(arr))[0][-1] # last index of max value

Output: 8

или

np.where(arr == np.max(arr))[0][0] # first index of max value

Output: 0

Вы можете затем перейдите к замене на индекс.

2 голосов
/ 17 февраля 2020

Вы можете использовать:

new_arr = np.zeros(shape=arr.shape)
new_arr[np.unravel_index(np.argmax(arr),shape=arr.shape)] = 1

Это также работает для многомерных массивов. np.argmax дает сглаженный индекс первого экземпляра элемента max, а np.unravel_index преобразует плоский индекс в индекс на основе формы массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...