我目前正在使用Python中的列表推导所代表的网格。我有起始单元格,比如grid[x][y]
。
每个坐标都有一个与之关联的特定值:grid[x][y].val = 20
我想检查所有周围的单元格,看看哪个单元格的值低于初始单元格,并且是所有周围单元格中最低的单元格。
我已经考虑过使用if语句手动检查每个单元格grid[x][y+1], grid[x+1][y], etc
,但我觉得必须有更好的方法。
我该如何处理?
答案 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