寻找网格中最大值的坐标

Gri*_*uld 5 list python-3.x

给定一个数字网格,例如

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]]
Run Code Online (Sandbox Code Playgroud)

我正在那个 2d 列表中搜索最大值,在这个例子中,显然是 4。要找到这个值,就max(max(graph,key=max))可以完成这项工作(即使我知道它两次调用 max 来获取最大值的行,所以它不是非常高效)

但这只是我正在寻找的一半。我需要这个 4 的坐标。我想要一段简短、高效、Python 的代码,这样 x, y = find_2d_max_index(g)可以给我最大数字的位置,而不需要之前做三重最大的事情。我想避免index()在找到最大值后使用该方法,因为那样效率非常低。

我研究了 numpy argmax,但无法让它在带有二维列表的应用程序中工作。

任何帮助表示赞赏。

aws*_*ice 8

您可以使用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
Run Code Online (Sandbox Code Playgroud)

说明:如果数组是一个平面数组,我们使用argmax未定义轴来获取最大项的索引,在这种情况下,16数字4将是16th这个长数组的元素。然后我们提供实际数组的形状np.unravel_index和最大项的索引,在这种情况下16,它根据数组的形状确定该数字的坐标。


Eli*_*igo 3

如果中的所有“行”都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
Run Code Online (Sandbox Code Playgroud)