有没有更有效的方法从另一个有点复杂的规则的数组生成数组?

时间:2019-04-30 22:47:57

标签: python arrays algorithm numpy

我正在尝试计算元素与数组中起点之间的距离。

这是一个数组

enter image description here

假设元素(0,1)是当前值最高的起点。

如果邻居具有一个共同点,并且在另一个轴上相差1个单位,则邻居是围绕特定点的元素。

通常,邻居可以是数组内部特定点的顶部,底部,左侧,右侧。

任务是用距离值标记每个元素,该距离值指示距起点(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 个答案:

答案 0 :(得分:4)

您正在为每个点计算距目标点的Manhattan distance(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