numpy python矩阵遍历向外扩展同心正方形

mzaanser  于 12个月前  发布在  Python
关注(0)|答案(1)|浏览(90)

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

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

的数据
有没有更自动化的/函数/库可以轻松地完成这一任务,而不是硬编码这些类型的值?

n53p2ov0

n53p2ov01#

不确定确切的逻辑,但假设xy是1的正方形左上角的坐标,你可以用numpy.where制作一个垂直和水平的数组,然后合并将它们与广播和numpy.maximum结合起来:

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])

相关问题