1

我有一个像这样的多维列表:

P= [ [55.0, 64.0, 71.0, 77.0, 81.0, 84.0, 85.0, 85.0, 83.0, 80.0],
    [0, 63.0, 71.0, 77.0, 82.0, 85.0, 87.0, 87.0, 86.0, 83.0],
    [0, 0, 69.0, 76.0, 81.0, 85.0, 87.0, 88.0, 87.0, 85.0], 
    [0, 0, 0, 73.0, 79.0, 83.0, 86.0, 87.0, 87.0, 85.0],
    [0, 0, 0, 0, 75.0, 80.0, 83.0, 85.0, 85.0, 84.0], 
    [0, 0, 0, 0, 0, 75.0, 79.0, 81.0, 82.0, 81.0], 
    [0, 0, 0, 0, 0, 0, 73.0, 76.0, 77.0, 77.0], 
    [0, 0, 0, 0, 0, 0, 0, 69.0, 71.0, 71.0], 
    [0, 0, 0, 0, 0, 0, 0, 0, 63.0, 64.0], 
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 55.0] ]

我想要一个程序,它找到这个矩阵的最大值,以及最大值的位置。在这个例子中,我正在寻找的是:输入 P[],返回 88.0,和 2,7

4

2 回答 2

3

如果你有NumPy,你可以像这样使用argmaxunravel_index

import numpy as np

P = [[55.0, 64.0, 71.0, 77.0, 81.0, 84.0, 85.0, 85.0, 83.0, 80.0],
[0, 63.0, 71.0, 77.0, 82.0, 85.0, 87.0, 87.0, 86.0, 83.0],
[0, 0, 69.0, 76.0, 81.0, 85.0, 87.0, 88.0, 87.0, 85.0],
[0, 0, 0, 73.0, 79.0, 83.0, 86.0, 87.0, 87.0, 85.0],
[0, 0, 0, 0, 75.0, 80.0, 83.0, 85.0, 85.0, 84.0],
[0, 0, 0, 0, 0, 75.0, 79.0, 81.0, 82.0, 81.0],
[0, 0, 0, 0, 0, 0, 73.0, 76.0, 77.0, 77.0],
[0, 0, 0, 0, 0, 0, 0, 69.0, 71.0, 71.0],
[0, 0, 0, 0, 0, 0, 0, 0, 63.0, 64.0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 55.0]]

P = np.array(P)
n = np.argmax(P, axis=None)
idx = np.unravel_index(n, P.shape)
print(idx)
# (2, 7)

maxval = P[idx]
print(maxval)
# 88.0

如果没有 NumPy,您可以使用max和列表推导:

maxval, i, j = max((item, i, j)  for i, row in enumerate(P)
                                 for j, item in enumerate(row))

print(maxval)
# 88.0

print(i, j)
# (2, 7)
于 2013-04-22T13:44:36.713 回答
1

unutbu 的回答很棒。这是一个更明显的解决方案,您可能会发现更直观。

curr_max = -float('inf')
curr_max_location = (None, None)
for (i, sublist) in enumerate(P):
    for (j, val) in enumerate(sublist):
        if val > curr_max:
            curr_max = val
            curr_max_location = (i, j)

print(curr_max)
print(curr_max_location)
于 2013-04-22T13:50:36.583 回答