Python 在网格中的周围单元格中查找最小值

Python 在网格中的周围单元格中查找最小值,python,list,Python,List,我目前正在使用Python中由列表表示的网格。我有一个起始单元格,比如在网格[x][y]上 每个坐标都有一个与之关联的特定值:grid[x][y]。val=20 我想检查所有周围的单元格,看看哪个单元格的值低于初始单元格,哪个单元格的值是所有周围单元格中最低的 我曾考虑过用一些if语句手动检查每个单元格grid[x][y+1]、grid[x+1][y]等,但我觉得必须有更好的方法 我应该如何处理这个问题?通常,您需要设置一个配对列表 deltas = [(-1, -1), (-1, 0), (-

我目前正在使用Python中由列表表示的网格。我有一个起始单元格,比如在
网格[x][y]

每个坐标都有一个与之关联的特定值:
grid[x][y]。val=20

我想检查所有周围的单元格,看看哪个单元格的值低于初始单元格,哪个单元格的值是所有周围单元格中最低的

我曾考虑过用一些if语句手动检查每个单元格
grid[x][y+1]、grid[x+1][y]等,但我觉得必须有更好的方法


我应该如何处理这个问题?

通常,您需要设置一个配对列表

deltas = [(-1, -1), (-1, 0), (-1, 1),
          ( 0, -1),          ( 0, 1),
          ( 1, -1), ( 1, 0), ( 1, 1)]
并在其上循环:

for dx, dy in deltas:
    grid[x + dx][y + dy]

此函数应实现以下功能:

def min_surround(grid, x, y):
    return min(grid[x+dx][y+dy].val for dx in range(-1, 2) for dy in range(-1, 2))

如果.val值存储在numpy数组中,那么查找区域的最小值就很简单了

import numpy as np
x = np.random.normal(size=[6,6])
z = np.min(x[0:3,2:5])
print x
print z
导致

[[-0.40201157  0.46485353  1.1052583   1.11755495 -1.83926315  1.52196255]
 [-1.33033205 -0.12079264  0.07514305 -0.54083923 -1.32646675 -0.678275  ]
 [-0.88322977  1.4105751   0.39753243 -0.89098143  0.95593871 -0.71951623]
 [ 0.49596028  0.21729938 -1.50148048  1.94903521  1.14637429 -1.10754165]
 [ 0.13870651 -2.10966853  0.4137035   0.3555691   0.36410423  0.3190395 ]
 [ 1.00280868  0.61461297 -2.23789591  0.54246954  2.03222197  1.05972663]]
-1.83926314797

请记住检查边缘情况——例如,如果x==0,则不希望检查x左侧不存在的单元格。此解决方案使用压缩代码的生成器表达式,并检查边界:

def nearest_lowest(grid,x,y):
    deltas = [(-1, -1), (-1, 0), (-1, 1),
              ( 0, -1),          ( 0, 1),
              ( 1, -1), ( 1, 0), ( 1, 1)]
    return min(grid[x+dx][y+dy].val for (dx, dy) in deltas \
            if 0 <= x+dx < 100 and 0 <= y+dy < 100)
def最近_最低(网格,x,y):
三角洲=[(-1,-1),(-1,0),(-1,1),
( 0, -1),          ( 0, 1),
( 1, -1), ( 1, 0), ( 1, 1)]
返回Delta中(dx,dy)的最小值(网格[x+dx][y+dy])\
如果0