有没有一行代码可以在矩阵中找到最大值?

14

要在一个数字矩阵中找到最大值,我们可以编写5行代码来解决这个问题:

ans = matrix[0][0]
for x in range(len(matrix)):
    for y in range(len(matrix[0])):
        ans = max(ans, matrix[x][y])
return ans

这个问题有没有一行代码的解决方案?实际上,我想到的那个解决方案相当笨拙:

return max(max(matrix, key=max))
或者
return max(map(max, matrix))

为什么在max函数中使用key=max?这没有意义。但是除此之外,它可以工作,所以你已经回答了自己的问题。如果您经常或使用大矩阵进行此操作,还可以使用numpy。 - user707650
@Evert max 函数中的 key=max 是因为对于每一行,您使用该行的最大值进行比较。 - user2558887
1
请牢记,将大量逻辑放入单行代码中是使您的代码难以阅读和维护的好方法。 - David says Reinstate Monica
什么是“矩阵”?你指的是一个列表的列表还是一个二维的NumPy数组? - RemcoGerlich
4个回答

17
您可以使用生成器表达式来查找矩阵中的最大值。这样,您就可以避免在内存中构建完整的矩阵元素列表。

您可以使用生成器表达式来查找矩阵中的最大值。这样,您就可以避免在内存中构建完整的矩阵元素列表。

maximum = max(max(row) for row in matrix)

在之前的回答中,使用了列表推导式而不是如此处所示:这里

maximum = max([max(row) for row in matrix])

以下内容来自PEP(解释部分):

......许多用例不需要在内存中创建完整的列表。相反,它们只需要按顺序迭代每个元素。

...

生成器表达式与诸如sum()、min()和max()之类的函数结合使用时特别有用,这些函数将可迭代输入减少为单个值。

...

与缩小函数(如sum()、min()和max())结合使用时,生成器表达式的效用大大增强。

此外,请看一下这篇SO文章:生成器表达式 vs. 列表推导式


8
我假设你指的是一个二维列表,而不是矩阵。
max([max(i) for i in matrix])

21
不需要创建一个中间列表,比如 max(max(i) for i in matrix) - 一个生成器表达式已经足够好了。 - AChampion

5

使用 numpy.amax

import numpy as np
>>> my_array
array([[1, 2, 3],
       [9, 8, 6]])
>>> np.amax(my_array)
9

问题的关键在于OP没有将数据存储在numpy数组中。如果您打算使用numpy解决方案来回答问题,那么您至少还需要添加代码来将Python列表转换为numpy数组。 - Bakuriu
@Bakuriu 实际上,虽然这个回答在当前形式上没有显示出来,但如果所有子列表具有相同的长度,Numpy 也将像对待“数组”一样操作列表中的列表。 (可能是因为 OP 将其称为矩阵的缘故。)话虽如此,如果您还没有使用 Numpy 的理由,那么它是一个大的依赖项,可能不值得为了仅此一个函数而引入。 - David Z

5
您也可以将数组压平:
from itertools import chain

flatten = chain.from_iterable

max(flatten(matrix))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接