首页 > 解决方案 > 如何创建一个 1 形成“菱形”形状的二维二进制数组

问题描述

我需要创建一个在给定边长时产生菱形的函数。菱形数组应由值 0 和 1 组成。

到目前为止,我想出了如何制作钻石,我不知道如何为不同边长编写函数

到目前为止,我有这个边长为 3 的解决方案:

import numpy as np

#line1
a=np.zeros(3+2)
a[3-1]=1

#line2
b=np.zeros(3+2)
b[3-2]=1
b[3]=1

#line3
c=np.zeros(3+2)
c[3-3]=1
c[3+1]=1

print(np.concatenate((a,b,c,b,a),axis=1).reshape(5,5))

如何编写不同长度的函数?
此外,如果给定长度 1 它应该返回[[1]]

标签: pythonnumpy

解决方案


您可以使用水平和垂直模式的交集来做到这一点:

import numpy as np

N       = 5
H       = abs(np.arange(1-N,N+1,2))//2
V       = H[0] - H[:,None]
diamond = (H==V)*1

print(diamond)

[[0 0 1 0 0]
 [0 1 0 1 0]
 [1 0 0 0 1]
 [0 1 0 1 0]
 [0 0 1 0 0]]

从视觉上看,这对应于行和列之间的相交数相等:

对于 N=7:

     [3, 2, 1, 0, 1, 2, 3]
   0  .  .  .  x  .  .  .         
   1  .  .  x  .  x  .  .
   2  .  x  .  .  .  x  .     
   3  x  .  .  .  .  .  x
   2  .  x  .  .  .  x  .
   1  .  .  x  .  x  .  .
   0  .  .  .  x  .  .  .

对于 N=8:

     [3, 2, 1, 0, 0, 1, 2, 3]
   0  .  .  .  x  x  .  .  .         
   1  .  .  x  .  .  x  .  .         
   2  .  x  .  .  .  .  x  .         
   3  x  .  .  .  .  .  .  x         
   3  x  .  .  .  .  .  .  x         
   2  .  x  .  .  .  .  x  .         
   1  .  .  x  .  .  x  .  .         
   0  .  .  .  x  x  .  .  .         

如果要填充钻石,请使用diamond = (H<=V)*1


推荐阅读