我试图计算元素和数组中的起点之间的距离。
这是一个数组
假设元素(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]]
符合预期,但我想知道是否有更有效的方法吗?
您正在计算每个点到目标点的曼哈顿距离(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