给定一个数字网格,例如
g=[[2, 2, 2, 3, 2],
   [2, -1, -1, 3, 3],
   [3, 2, -1, 3, 3],
   [2, 4, 3, 3, 3],
   [-1, 2, 2, -1, 1]]
我正在那个 2d 列表中搜索最大值,在这个例子中,显然是 4。要找到这个值,就max(max(graph,key=max))可以完成这项工作(即使我知道它两次调用 max 来获取最大值的行,所以它不是非常高效)
但这只是我正在寻找的一半。我需要这个 4 的坐标。我想要一段简短、高效、Python 的代码,这样
x, y = find_2d_max_index(g)可以给我最大数字的位置,而不需要之前做三重最大的事情。我想避免index()在找到最大值后使用该方法,因为那样效率非常低。
我研究了 numpy argmax,但无法让它在带有二维列表的应用程序中工作。
任何帮助表示赞赏。
您可以使用numpy它,文档说明了如何使用。
import numpy as np
a = np.array([[2, 2, 2, 3, 2],
   [2, -1, -1, 3, 3],
   [3, 2, -1, 3, 3],
   [2, 4, 3, 3, 3],
   [-1, 2, 2, -1, 1]])
idx = np.unravel_index(np.argmax(a), a.shape)
a[idx]
>> 4
说明:如果数组是一个平面数组,我们使用argmax未定义轴来获取最大项的索引,在这种情况下,16数字4将是16th这个长数组的元素。然后我们提供实际数组的形状np.unravel_index和最大项的索引,在这种情况下16,它根据数组的形状确定该数字的坐标。
如果中的所有“行”都graph具有相同的长度(graph相当于 2D numpy 数组),那么您可以简单地找到线性展开中最大值的位置,并从该位置和“列”的数量推断出坐标graph(这就是 numpy 在底层的工作原理)。
import operator as op
from itertools import chain
ncol = len(graph[0])
flattened = chain.from_iterable(graph)
max_idx, max_val = max(enumerate(flattened), key=op.itemgetter(1))
row = max_idx // ncol
col = max_idx % ncol
# a simple sanity check
assert graph[row][col] == max_val