Проблема в том, что сравнение a == a.min(axis=1)
сравнивает каждый столбец до минимального значения каждой строки, а не сравнивая каждую строку до минимальных значений. Это связано с тем, что a.min(axis=1)
возвращает вектор, а не матрицу, которая ведет себя аналогично массиву Nx1
. Таким образом, при трансляции оператор ==
выполняет операцию по-разному, чтобы соответствовать размерам.
a == a.min(axis=1)
# array([[ True, False, False],
# [False, False, False],
# [False, False, True]], dtype=bool)
Одним из возможных способов исправить это resize
результат a.min(axis=1)
в вектор-столбец (например, 3 х 1 2D массива).
a == np.resize(a.min(axis=1), [a.shape[0],1])
# array([[ True, False, False],
# [ True, False, False],
# [False, False, True]], dtype=bool)
Или еще проще, как @ColonelBeuvel показал:
a == a.min(axis=1)[:,None]
Применяя это для всей строки кода.
a_masked = np.ma.masked_where(a == np.resize(a.min(axis=1),[a.shape[0],1]), a)
# masked_array(data =
# [[-- 11 5]
# [-- 9 9]
# [5 7 --]],
# mask =
# [[ True False False]
# [ True False False]
# [False False True]],
# fill_value = 999999)
Спасибо за объяснение! Он работает сейчас, благодаря @Colonel Beauvel, а также –
У меня есть дополнительный вопрос на самом деле. Что делать, если у меня есть строка с двумя или тремя одинаковыми элементами, например: a = array ([[7, 5, 5], [3, 6, 9], [5, 1, 1]]) Как я могу только замаскировать одно из минимального значения, а не все? –
Можете ли вы помочь мне? @ColonelBeuvel –