如何在python中的列表矩阵中选择最大数字?

时间:2011-10-09 00:05:15

标签: python algorithm optimization

我有一个列表列表,其中前两个充当“矩阵”,我可以在其中访问第三个列表

list3 = m[x][y]   

并且第三个列表包含字符串和数字的混合,但每个列表具有相同的大小和数字。结构体。让我们调用此列表中的特定条目“兴趣数量”。此数字在此列表中始终具有相同的索引!

获取Python中感兴趣的最大数量的列表的'坐标'(x,y)的最快方式是什么?

谢谢!

(实际上,我正在尝试选择m [x] [y] [k]中的最大数字,其中k是固定的,对于所有x& y,并且“知道”它的地址是什么)

3 个答案:

答案 0 :(得分:4)

max((cell[k], x, y)
    for (y, row) in enumerate(m)
    for (x, cell) in enumerate(row))[1:]

此外,您可以将结果直接分配给几个变量:

(_, x, y) = max((cell[k], x, y)
                for (y, row) in enumerate(m)
                for (x, cell) in enumerate(row))

这是O( n 2 ),顺便说一句。

答案 1 :(得分:3)

import itertools

indexes = itertools.product( xrange(len(m)), xrange(len(m[0]))
print max(indexes, key = lambda x: m[x[0]][x[1]][k])

或使用numpy

import numpy
data = numpy.array(m)
print numpy.argmax(m[:,:,k])

你有兴趣加速python中的操作,你真的需要看看numpy。

答案 2 :(得分:0)

假设“感兴趣的数量”位于列表中的已知位置,并且将存在非零最大值,

maxCoords = [-1, -1]
maxNumOfInterest = -1
rowIndex = 0
for row in m:
    colIndex = 0
    for entry in row:
        if entry[indexOfNum] > maxNumOfInterest:
            maxNumOfInterest = entry[indexOfNum]
            maxCoords = [rowIndex,colIndex]
        colIndex += 1
    rowIndex += 1

是一种天然的方法,对于矩阵的大小将是O(n 2 )。由于您必须检查每个元素,因此这是最快的解决方案。

@ Marcelo的方法更加多汁,但可能性较差。