Как использовать функции argmin и argmax над элементом np.matrix в python? - PullRequest
0 голосов
/ 01 июля 2019

У меня следующая ситуация.Давайте определим матрицу D (8,4):

import numpy as np
import random

D=np.matrix([[72 22 58 63]
            [28 22 32 20]
            [40 41 58 20]
            [22 58 22 41]
            [28 78 51 45]
            [58 61 28 71]
            [51 22 28 51]
            [22 63 54 22]])

Давайте установим случайный столбец:

j=np.random.choice(range(4))

Мы сохраним это значение в пустом списке Sp.

Sp=[]
Sp.append(j)

Я хочу определить индекс максимального значения в матрице D для этого столбца.

z=D[:,j].argmax(axis=0)

Пока все работает нормально.Теперь я хочу сделать тот же процесс, но только для подмножества строк матрицы D над столбцом j (для простоты оставим это исправленным).Я попробовал это

j=2                      #COLUMN.
a=[1,2,3,4]              #SUBSET OF ROWS TO CHECK.
z=D[a,j].argmax(axis=0)

Проблема в том, что возвращаемый индекс - это не тот, кто соответствует элементу в матрице D, а индекс в матрице D [a, j].Результат должен быть z = 2, что соответствует значению 58, тем не менее, возвращаемое значение было z = 1, которое является позицией значения 58, но в матрице D [a, j].

[[32]
 [58]
 [22]
 [51]]

Мне нужен индекс по отношению к исходной матрице (D), когда я делаю этот процесс.Любая идея?Я видел некоторые подходы, но я думаю, что должен быть какой-то простой способ сделать это?

Обратите внимание, что это не то же самое, что этот вопрос , потому что подмножество строк не всегда [1,2,3] или [5,6,7].Мой пример обращается к общему подмножеству, например, [2,7,3,4] без четкого начала - конца.

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Я вижу, что объявление матрицы D неверно, должно быть импортировать NumPy как NP случайный импорт

D=np.matrix([[72, 22, 58, 63],
             [28, 22, 32, 20],
             [40, 41, 58, 20],
             [22, 58, 22, 41],
             [28, 78, 51, 45],
             [58, 61, 28, 71],
             [51, 22, 28, 51],
             [22, 63, 54, 22]])

Чтобы использовать argmax или argmin, правильный путь -

j=np.random.choice(range(4))
Sp=[]
Sp.append(j)

z = np.argmax(D[:,j], axis=0)
print(z)

Это напечатает требуемый результат Вы можете обратиться введите описание ссылки здесь

0 голосов
/ 01 июля 2019

Немного обходной путь, но он дает вам нужный индекс в D:

j = 2
a = [1, 2, 3, 4]
z = D[a, j].max()

дает нам значение максимума: 58

С этой информацией мыищите все значения в D с помощью 58 и создайте новый массив с индексами всех максимальных значений:

arr = np.where(D == 58)
w = np.array(list(zip(*arr)))

, который получит нас:

array([[0, 2],
       [2, 2],
       [3, 1],
       [5, 0]], dtype=int64)

теперь мыпроверьте с возможными индексами из нашего диапазона a, j с:

i = np.array(list(zip([j for _ in range(len(a))], a))) # array([[2, 1],
                                                       #        [2, 2],
                                                       #        [2, 3],
                                                       #        [2, 4]])
w[w == i]

, тогда результат будет:

array([2, 2], dtype=int64)

, который является индексом максимального значения в D от D[a,j]


ОБНОВЛЕНИЕ с предложенной ссылкой @Georgy ссылка :

arr = np.where(D == 58)
arr[0][D[a,j].argmax()]

тогда вывод 2,если вы просто хотите, чтобы индекс строки вашего максимального значения.

...