gpt4 book ai didi

python - 有效地创建数值远离中心的递减数组

转载 作者:行者123 更新时间:2023-11-28 22:20:21 24 4
gpt4 key购买 nike

N 为奇数正整数。我想创建一个形状为 N x N 的方形二维网格,其中中心元素为 N,周围的 8 个邻域的值为 N-1,该邻域周围的元素具有值 N-2 等,因此数组的“外壳”最终具有值 N//2。我可以在 for 循环中使用 np.pad 来完成此操作,该循环将“shell”迭代添加到数组中:

def pad_decreasing(N):
assert N % 2 == 1
a = np.array([[N]])
for n in range(N-1, N//2, -1):
a = np.pad(a, 1, mode='constant', constant_values=n)
return a

示例输出:

In: pad_decreasing(5)
Out:
array([[3, 3, 3, 3, 3],
[3, 4, 4, 4, 3],
[3, 4, 5, 4, 3],
[3, 4, 4, 4, 3],
[3, 3, 3, 3, 3]])

问题。我能否以不求助于 for 循环的“矢量化”形式完成此任务?对于较大的 N,此代码相当慢。

最佳答案

中心到网格中任意点的距离可以写成np.maximum(np.abs(row - center), np.abs(col - center));然后 N 减去这个距离得到你需要的洋葱:

N = 5

# the x and y coordinate of the center point
center = (N - 1) / 2

# the coordinates of the square array
row, col = np.ogrid[:N, :N]

# N - distance gives the result
N - np.maximum(np.abs(row - center), np.abs(col - center))

# array([[3, 3, 3, 3, 3],
# [3, 4, 4, 4, 3],
# [3, 4, 5, 4, 3],
# [3, 4, 4, 4, 3],
# [3, 3, 3, 3, 3]])

关于python - 有效地创建数值远离中心的递减数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49021841/

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