python - 如何快速生成具有圆环几何形状的 numpy 曼哈顿距离数组?
问题描述
我有一个 N x M 字段,我想创建一个矩阵,其中包含曼哈顿到特定位置的距离。此外,该场环绕在所有末端(环面)。
我可以在 Numpy 中快速生成这个(不进行缓慢的洪水填充循环)吗?
例如该函数将返回
f(x=2, y=3, size_x=8, size_y=8) ->
array([[5, 4, 3, 2, 3, 4, 5, 6],
[4, 3, 2, 1, 2, 3, 4, 5],
[3, 2, 1, 0, 1, 2, 3, 4],
[4, 3, 2, 1, 2, 3, 4, 5],
[5, 4, 3, 2, 3, 4, 5, 6],
[6, 5, 4, 3, 4, 5, 6, 7],
[7, 6, 5, 4, 5, 6, 7, 8],
[6, 5, 4, 3, 4, 5, 6, 7]])
这里位置(2,3)的距离为零,所有其他位置的曼哈顿/出租车距离(2,3),同时能够在边缘环绕。
解决方案
您可以使用numpy.roll为 x 和 y 轴的移动创建模板,然后使用numpy.add.outer
它们按轴添加。
import numpy as np
def f(x, y, size_x, size_y):
"""
>>> f(x=2, y=3, size_x=8, size_y=8)
array([[5, 4, 3, 2, 3, 4, 5, 6],
[4, 3, 2, 1, 2, 3, 4, 5],
[3, 2, 1, 0, 1, 2, 3, 4],
[4, 3, 2, 1, 2, 3, 4, 5],
[5, 4, 3, 2, 3, 4, 5, 6],
[6, 5, 4, 3, 4, 5, 6, 7],
[7, 6, 5, 4, 5, 6, 7, 8],
[6, 5, 4, 3, 4, 5, 6, 7]])
>>> f(x=1, y=1, size_x=3, size_y=3)
array([[2, 1, 2],
[1, 0, 1],
[2, 1, 2]])
"""
a, b = divmod(size_x, 2)
x_template = np.r_[:a+b, a:0:-1] # [0 1 2 1] for size_x == 4 and [0 1 2 2 1] for size_x == 5
x_template = np.roll(x_template, x) # for x == 2, size_x == 8: [2 1 0 1 2 3 4 3]
a, b = divmod(size_y, 2)
y_template = np.r_[:a+b, a:0:-1]
y_template = np.roll(y_template, y)
return np.add.outer(x_template, y_template)
推荐阅读
- angular - 从值成对出现的永无止境的流中获取第一个值
- mysql - 从 SQL 查询结果中求和不相等并删除重复项
- java - 使用 return vs While(condition) 方法来打破循环
- python - 如何在相同坐标上转动蛇段?
- spring - 在 Spring Boot 和 Hibernate 中使用 HikariCP 时可能出现 SQL Too many connections 问题的可能情况有哪些?
- php - Preg_split 创建一个数组,但使其为空
- machine-learning - 线性回归中最小化成本函数的遗传算法
- python - 如何循环和迭代将多个 csv 文件导入 AWS 存储桶?
- python - 为什么y轴的增量为1而不是90
- r - R中的数据透视表,一天中的每个小时都有一列