Есть ли более эффективный способ создания массива из другого массива с немного сложным правилом? - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь вычислить расстояние между элементом и начальной точкой в ​​массиве.

Вот массив

enter image description here

предположим, что элемент (0,1) является начальной точкой, имеющей самое высокое значение в настоящее время.

Соседи - это элементы вокруг определенной точки, если они имеют одну общую ось и отличаются на другой оси на 1unit.

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

Задача состоит в том, чтобы пометить все элементы значением расстоянияуказать, как далеко он находится от начальной точки (0,1).

ds = np.array([[1, 2, 1],
       [1, 1, 0],
       [0, 1, 1]])

dist = np.full_like(ds, -1)
p0 = np.where(ds == 2)
dist[p0] = 0
que = []
que.append(p0)
nghb_x = [0, 0, -1, 1]
nghb_y = [-1, 1, 0, 0]

while len(que):
    x, y = que.pop()
    d = dist[(x,y)]
    for idx0, idx1 in zip(nghb_x, nghb_y):
        tmp_x = x + idx0
        tmp_y = y + idx1
        if np.any(tmp_x >= 0) and np.any(tmp_x < ds.shape[0]) and np.any(tmp_y >= 0) and np.any(tmp_y < ds.shape[1]) and np.any(dist[(tmp_x,tmp_y)] == -1):
            dist[(tmp_x,tmp_y)] = d + 1 # distance = distance(x) + 1
            que.append((tmp_x, tmp_y))

print('dist:')
print(dist)

выход

dist:
[[1 0 1]
 [2 1 2]
 [3 2 3]]

, как и ожидалось, хотя, я хотел бы знать, есть ли ещеэффективный способ сделать это?

1 Ответ

4 голосов
/ 01 мая 2019

Вы рассчитываете Манхэттенское расстояние (расстояние по x плюс расстояние по y) от целевой точки для каждой точки.

Вы можете использовать функцию numpy, чтобы сделать это за один шаг, учитывая координаты цели и форму массива:

target = (0, 1)
np.fromfunction(lambda x,y: np.abs(target[0]-x) + np.abs(target[1]-y), ds.shape)    

Результат:

[[1. 0. 1.]
 [2. 1. 2.]
 [3. 2. 3.]]

Демо: https://repl.it/repls/TrustyUnhappyFlashdrives

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...