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

时间:2016-02-10 01:43:36

标签: python list

我目前正在使用Python中的列表推导所代表的网格。我有起始单元格,比如grid[x][y]

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

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

我已经考虑过使用if语句手动检查每个单元格grid[x][y+1], grid[x+1][y], etc,但我觉得必须有更好的方法。

我该如何处理?

4 个答案:

答案 0 :(得分:2)

通常,您需要设置对列表

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]

答案 1 :(得分:1)

请记住检查边缘情况 - 例如,如果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)

请注意,我假设有100x100网格;根据需要更改代码(或将其添加为变量)。

答案 2 :(得分:0)

这个功能可以解决问题:

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))

答案 3 :(得分:0)

如果.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