Сравнивая значения в массиве n-измерения

Необходимо сравнить каждое значение в массиве numpy и вернуть 1 для наибольшего значения и 0 для остальных. У меня проблема с разными номерами [].

Пример ввода:

[[[0.6673975 0.33333233]]
.
.
.
[[0.33260247 0.6673975]]]

Ожидаемый результат:

[[[1 0]]
.
.
.
[[0 1]]]

2 ответа

Решение

Макс по оси:

Если, как предполагает Джо в комментариях, вы ищете максимум вдоль оси, то для оси axis,

np.moveaxis((np.moveaxis(ar, axis, 0) == ar.max(axis)).astype(int), 0, axis)

или немного быстрее,

(ar == np.broadcast_to(np.expand_dims(ar.max(axis), axis), ar.shape)).astype(int)

Должен охватить n-мерный корпус.

Пример:

ar = np.random.randint(0, 100, (2, 3, 4))

ar
Out[157]: 
array([[[17, 28, 22, 31],
        [99, 51, 65, 65],
        [46, 24, 93,  4]],

       [[ 5, 84, 85, 79],
        [ 7, 80, 27, 25],
        [46, 80, 90,  3]]])

(ar == np.broadcast_to(np.expand_dims(ar.max(-1), -1), ar.shape)).astype(int)
Out[159]: 
array([[[0, 0, 0, 1],
        [1, 0, 0, 0],
        [0, 0, 1, 0]],

       [[0, 0, 1, 0],
        [0, 1, 0, 0],
        [0, 0, 1, 0]]])
ar.max(-1)
Out[160]: 
array([[31, 99, 93],
       [85, 80, 90]])

Макс по всему массиву:

На случай, если вы попытаетесь идентифицировать элементы, равные максимуму по всему массиву,

(ar == ar.max()).astype(int)

должен дать то, что вы ищете.

Давайте создадим пример для работы с:

a = np.array([[1, 2, 3], [4, 6, 5], [9, 1, 1]])

тогда мы можем перебрать с for-loop за последний ряд (второй последний axis) и изменить это axis соответственно:

for i in range(a.shape[-2]):
    a[..., i, :] = a[..., i, :] == max(a[..., i, :])

И это изменит a до правильного результата:

array([[0, 0, 1],
       [0, 1, 0],
       [1, 0, 0]])

И этот же метод будет работать для любого прямоугольника array, такие как:

a = np.array([[1, 2], [4, 3], [9, 7]])

давая:

array([[0, 1],
       [1, 0],
       [1, 0]])
Другие вопросы по тегам