Сравнивая значения в массиве 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]])