Получить индексы 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) в исходной матрице. Но как получить их индексы? Я пытался!--5-->, С помощью args непосредственно в качестве индекса для матрицы x, куча функций от numpy до index без успеха.

используя 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 () на многомерных массивах