Python 矩阵遍历向外扩展同心方块

python matrix traversal expanding outwards concentric squares

提问人:Miss_Orchid 提问时间:11/16/2023 更新时间:11/16/2023 访问量:45

问:

假设我有一个 5x5 矩阵,如下所示:

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

根据某个位置,我在 (x,y) 坐标中得到了一个索引,我想在其中开始构建值之外的同心正方形。以下是一些示例:

3 3 3 3 3
3 2 2 2 2
3 2 1 1 2
3 2 1 1 2
3 2 2 2 2
2 2 2 3 4
1 1 2 3 4
1 1 2 3 4
2 2 2 3 4
3 3 3 3 4

有没有更自动化的/函数/库可以很容易地做到这一点,而不是对这些类型的值进行硬编码?

python numpy

评论


答:

1赞 mozway 11/16/2023 #1

不确定确切的逻辑,但假设 ,1s 正方形左上角的坐标,您可以使用 numpy.where 制作一个垂直和水平数组,并将它们与 broadcasting 和 numpy.maximum 组合:xy

x, y = 2, 2
N = 5

Xs = np.arange(N)-x
Ys = np.arange(N)-y

out = np.maximum(np.where(Xs>0, Xs, 1-Xs)[:, None],
                 np.where(Ys>0, Ys, 1-Ys)
                )

输出:

array([[3, 3, 3, 3, 3],
       [3, 2, 2, 2, 2],
       [3, 2, 1, 1, 2],
       [3, 2, 1, 1, 2],
       [3, 2, 2, 2, 2]])

输出 :x = 1 ; y = 0 ; N = 6

array([[2, 2, 2, 3, 4, 5],
       [1, 1, 2, 3, 4, 5],
       [1, 1, 2, 3, 4, 5],
       [2, 2, 2, 3, 4, 5],
       [3, 3, 3, 3, 4, 5],
       [4, 4, 4, 4, 4, 5]])

中间体 ():x = 5 ; y = 5 ; N = 5

# Xs
array([-2, -1,  0,  1,  2])

# np.where(Xs>0, Xs, 1-Xs)[:, None]
array([[3],
       [2],
       [1],
       [1],
       [2]])

# Ys
array([-2, -1,  0,  1,  2])

# np.where(Ys>0, Ys, 1-Ys)
array([3, 2, 1, 1, 2])

评论

0赞 Miss_Orchid 11/16/2023
这看起来很棒。我应该在原来的帖子中提到,但是有没有办法停在某个数字上?例如,如果我仍然有 5x5 网格,但只将同心方块构建为数字 2 或 3 等?
0赞 mozway 11/16/2023
我想你可以剪辑中间数组或输出。