gpt4 book ai didi

python - 如何快速生成具有环面几何形状的 numpy Manhattan 距离阵列?

转载 作者:行者123 更新时间:2023-12-04 15:24:39 24 4
gpt4 key购买 nike

我有一个 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)

关于python - 如何快速生成具有环面几何形状的 numpy Manhattan 距离阵列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62522809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com