Как получить максимальное значение в матрице и номер ее строки - PullRequest
0 голосов
/ 26 апреля 2019

Я хотел бы получить максимальное значение матрицы и просто ее положение строки в матрице. Как это сделать? Еще раз спасибо.

Я могу получить максимальное значение в матрице с помощью следующего кода; но я не уверен, как получить позицию индекса строки. Следует отметить, что матрица также может иметь равные значения для каждой строки.

ratio =[[0.01556884 0.01556884]
 [0.1290337  0.1290337 ]
 [0.07015939 0.07015939]
 [0.12288323 0.12288323]]
        dup = []
        for k in ratio:
            for i in k:
                dup.append(i)

print(max(dup))

0.1290337

Я ожидаю получить максимальное значение, которое у меня уже было, 0.129037 и положение 1

Может ли кто-нибудь помочь мне занять позицию в ряду?

Ответы [ 4 ]

2 голосов
/ 26 апреля 2019

Предполагая, что у вас есть данные во вложенном списке Python, вы можете сделать это с помощью генератора, подобного этому:

ratio =[[0.01556884, 0.01556884],
        [0.1290337,  0.1290337 ],
        [0.07015939, 0.07015939],
        [0.12288323, 0.12288323]]
max_val, row_max, col_max = max((value, i, j)
                                for i, row in enumerate(ratio)
                                for j, value in enumerate(row))
print(f'Max value: ratio[{row_max}][{col_max}] = {max_val}')
# Max value: ratio[1][1] = 0.1290337

Если у вас есть массив NumPy, вы можете сделать:

import numpy as np

ratio = np.array([[0.01556884, 0.01556884],
                  [0.1290337,  0.1290337 ],
                  [0.07015939, 0.07015939],
                  [0.12288323, 0.12288323]])
row_max, col_max = np.unravel_index(np.argmax(ratio), ratio.shape)
max_val = ratio[row_max, col_max]
print(f'Max value: ratio[{row_max}][{col_max}] = {max_val}')
# Max value: ratio[1][0] = 0.1290337

Обратите внимание на разные ответы из-за двух позиций массива, содержащих максимальное значение.

2 голосов
/ 26 апреля 2019

Это отлично сработает (в исходной матрице ratio отсутствуют запятые):

ratio = [[0.01556884, 0.01556884],
         [0.1290337,  0.1290337],
         [0.07015939, 0.07015939],
         [0.12288323, 0.12288323]]

max_val = 0
idx = None

for i, row in enumerate(ratio):
    if max(row) > max_val:
        max_val = max(row)
        idx = i

print(f"max value: {max_val}, at row: {idx}")

Выход:

max value: 0.1290337, at row: 1

Или то же самое более кратко:

ratio = [[0.01556884, 0.01556884],
         [0.1290337,  0.1290337],
         [0.07015939, 0.07015939],
         [0.12288323, 0.12288323]]

idx, max_val = max(enumerate(map(max, ratio)), key=lambda x: x[1])

print(f"max value: {max_val}, at row: {idx}")

Выход:

max value: 0.1290337, at row: 1
1 голос
/ 26 апреля 2019

Вот наивная реализация, использующая двойной цикл for.

ratio = [[0.01556884, 0.01556884],
         [0.1290337, 0.1290337 ],
         [0.07015939, 0.07015939],
         [0.12288323, 0.12288323]]

max_val = ratio[0][0]
max_loc = (0,0)
for i, row in enumerate(ratio):
    for j, idx in enumerate(row):
        if ratio[i][j] > max_val:
            max_val = ratio[i][j]
            max_loc = (i, j)

print(f"max value {max_val} at {max_loc}")

Выходы:

max value 0.1290337 at (1, 0)

Нет причин копировать значения в новый массив.Если вы уже просматриваете вложенный список, просто следите за индексом и максимальным значением.

1 голос
/ 26 апреля 2019

Использование max и enumerate:

ratio =[[0.01556884, 0.01556884], [0.1290337,  0.1290337 ],[0.07015939, 0.07015939],[0.12288323, 0.12288323]]

print(max(enumerate(map(max, ratio)), key=lambda x:x[1]))

Результаты:

(1, 0.1290337)
...