2017-02-20 17 views
0

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

nnlst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

MAP_WIDTH = 3 
MAP_HEIGHT = 3 


def nearest_neighbors(map_x, map_y): 
    coordinates_list = [] 
    for x_ in range(max(0, map_x - 1), min(MAP_WIDTH, map_x + 2)): 
     for y_ in range(max(0, map_y - 1), min(MAP_HEIGHT, map_y + 2)): 
      # we are ignoring result when x_ and y_ equals variable we ask for 
      if (map_x, map_y) == (x_, y_): 
       continue 
      coordinates_list.append([x_, y_]) 
    return coordinates_list 

print "function result" 
print "nearest neighbors of", nnlst[0][1] 
nearest_neighbor_coordinates_list = nearest_neighbors(0, 1) 

for coordinates in nearest_neighbor_coordinates_list: 
    print coordinates, "=", nnlst[coordinates[0]][coordinates[1]] 

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

ответ

1

Вам нужно добавить еще одно условие, чтобы предотвратить включение диагональными:

def nearest_neighbors(map_x, map_y): 
    coordinates_list = [] 
    for x_ in range(max(0, map_x - 1), min(MAP_WIDTH, map_x + 2)): 
     for y_ in range(max(0, map_y - 1), min(MAP_HEIGHT, map_y + 2)): 
      # we are ignoring result when x_ and y_ equals variable we ask for, also the diagonal neigbors that differ in both x & y coordinates 
      if (map_x, map_y) == (x_, y_) or (map_x != x_ and map_y != y_): 
       continue 
      coordinates_list.append([x_, y_]) 
    return coordinates_list 

, чтобы получить желаемый результат:

function result 
nearest neighbors of 2 
[0, 0] = 1 
[0, 2] = 3 
[1, 1] = 5 
+1

Я наконец-то понял этот код спасибо за ответ. – Hsin

1

в качестве альтернативы, вы можете перечислить все «допустимые» смещения в явном виде :

for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]: 
    x_ = min(MAP_WIDTH, max(0, map_x + dx)) 
    y_ = min(MAP_HEIGHT, max(0, map_y + dy)) 

    if (map_x, map_y) == (x_, y_): 
     continue 

    ... 
1

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

Вот что я имею в виду:

nnlist = [[1, 2, 3], 
      [4, 5, 6], 
      [7, 8, 9]] 

MAP_WIDTH = len(nnlist[0]) 
MAP_HEIGHT = len(nnlist) 

nearest_neighbors = {} # is now a dictionary 
for x in range(MAP_WIDTH): 
    for y in range(MAP_HEIGHT): 
     neighbors = [[nx, ny] for nx, ny in [(x-1, y), (x+1, y), (x, y-1), (x, y+1)] 
            if -1 < nx < MAP_WIDTH and -1 < ny < MAP_HEIGHT] 
     nearest_neighbors[(x, y)] = neighbors 

print "look-up result" 
print "nearest neighbors of", nnlist[0][1] 
nearest_neighbor_coordinates_list = nearest_neighbors[(0, 1)] 

for coordinates in nearest_neighbor_coordinates_list: 
    print coordinates, "=", nnlist[coordinates[0]][coordinates[1]] 

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

  • Нет связанных вопросов^_^