Получить индексы элементов numpy.argmax по оси

У меня есть N-мерная матрица, которая содержит значения для функции с N параметрами. Каждый параметр имеет дискретное количество значений. Мне нужно максимизировать функцию по всем параметрам, кроме одного, в результате чего получается одномерный вектор с размером, равным количеству значений не максимизированного параметра. Мне также нужно сохранить, какие значения принимаются другими параметрами.

Для этого я хотел бы применить итеративно numpy.max по разным осям, чтобы уменьшить размерность матрицы, чтобы найти то, что мне нужно. Окончательный вектор будет зависеть только от того параметра, который я пропустил.

Однако у меня возникают проблемы с поиском исходных индексов конечных элементов (которые содержат информацию о значениях, взятых другими параметрами). Я хоть об использовании numpy.argmax так же, как numpy.max но я не могу получить исходные показатели.

Пример того, что я пытаюсь это:

x = [[[1,2],[0,1]],[[3,4],[6,7]]]
args = np.argmax(x, 0)

Это возвращает

[[1 1]
 [1 1]]

Это означает, что argmax выбирает элементы (2,1,4,7) в исходной матрице. Но как получить свои показатели? Я старался unravel_index, с использованием args непосредственно в качестве индекса для матрицы x, куча функций от NumPy до индекса без успеха.

С помощью numpy.where не является решением, поскольку входная матрица может иметь одинаковые значения внутри, поэтому я не смогу отличить разные исходные значения.

1 ответ

Решение

x.argmax(0) дает индексы вдоль 1-й оси для максимальных значений. использование np.indices генерировать индексы для другой оси.

x = np.array([[[1,2],[0,1]],[[3,4],[6,7]]])
x.argmax(0)
    array([[1, 1],
           [1, 1]])
a1, a2 = np.indices((2,2))
(x.argmax(0),a1,a2)
    (array([[1, 1],
            [1, 1]]),
     array([[0, 0],
            [1, 1]]),
     array([[0, 1],
            [0, 1]]))


x[x.argmax(0),a1,a2]
    array([[3, 4],
           [6, 7]])

x[a1,x.argmax(1),a2] 
    array([[1, 2],
           [6, 7]])

x[a1,a2,x.argmax(2)] 
    array([[2, 1],
           [4, 7]])

Если x имеет другие размеры, генерировать a1, а также a2 соответственно.

Официальная документация мало говорит о том, как использовать argmax, но ранее ТАК обсуждали это. Я получил эту общую идею от использования numpy.argmax() на многомерных массивах

Другие вопросы по тегам