2016-02-10 1 views
1

В настоящее время я работаю с сеткой, представленной в Python. У меня начальная ячейка, скажем, grid[x][y].Найти наименьшее значение в окружении ячеек в сетке

Каждая координата имеет определенное значение, связанное с ним: grid[x][y].val = 20

я хотел бы, чтобы проверить все окружающие клетки, чтобы увидеть, какая из них имеет значение ниже исходной ячейки и является наименьшим из всех окружающих клеток.

Я думал о проверке каждой ячейки вручную grid[x][y+1], grid[x+1][y], etc с некоторыми операциями if, но у меня есть ощущение, что должен быть лучший способ.

Как мне подойти к этому?

ответ

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

Не забудьте проверить крайние случаи - если х == 0, вы не хотите, чтобы проверить несуществующую ячейку слева от х, например, , Это решение использует выражение генератора для компактного кода, а также проверяет границы:

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; при необходимости измените код (или добавьте его как переменную).

Смежные вопросы