如何创建一个 1 形成“菱形”形状的二维二进制数组
Posted
技术标签:
【中文标题】如何创建一个 1 形成“菱形”形状的二维二进制数组【英文标题】:How to create a 2D binary array with 1's forming a "diamond" shape 【发布时间】:2019-07-02 15:39:41 【问题描述】:我需要创建一个在给定边长时产生菱形形状的函数。菱形数组应该由值 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]]
【问题讨论】:
【参考方案1】:您可以使用水平和垂直模式的交集来做到这一点:
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
【讨论】:
【参考方案2】:我采取了更长的方式,因此我可以扩展该功能以处理其他几何形状
import numpy as np
def diamondarray(dimension=1):
#// initialize 2d array
a=np.zeros((dimension,dimension))
#// find the middle of the array
midpoint=(dimension-1)/2
#// initialize an offset
offset=-1
offsetstep=1
#// loop through rows and columns
for row in range(dimension):
if dimension%2 == 0 and row == np.ceil(midpoint):
#// repeat offset for second midpoint row
offset=offset
else:
if row <= np.ceil(midpoint):
#// increase offset for each row for top
offset=offset+offsetstep
else:
#// decrease offset for each row for bottom
offset=offset-offsetstep
for col in range(dimension):
#// set value to one
if dimension%2 == 0:
if col <= np.floor(midpoint):
if col == np.floor(midpoint)-offset:
a[row,col]=fill
if col >= np.ceil(midpoint):
if col == int(midpoint)+offset+1:
a[row,col]=fill
else:
if col == midpoint+offset or col == midpoint-offset:
pass
a[row,col]=fill
return a
对于 N=5:
打印(钻石阵列(5))
[[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=8:
打印(钻石阵列(8))
[[0. 0. 0. 1. 1. 0. 0. 0.]
[0. 0. 1. 0. 0. 1. 0. 0.]
[0. 1. 0. 0. 0. 0. 1. 0.]
[1. 0. 0. 0. 0. 0. 0. 1.]
[1. 0. 0. 0. 0. 0. 0. 1.]
[0. 1. 0. 0. 0. 0. 1. 0.]
[0. 0. 1. 0. 0. 1. 0. 0.]
[0. 0. 0. 1. 1. 0. 0. 0.]]
【讨论】:
更新循环以处理偶数,正如 alain-t 在响应中显示的那样。 Github 用于其他功能和测试用例。以上是关于如何创建一个 1 形成“菱形”形状的二维二进制数组的主要内容,如果未能解决你的问题,请参考以下文章
2021-07-28:最短的桥。在给定的二维二进制数组 A 中,存在两座岛。(岛是由四面相连的 1 形成的一个最大组。)现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛。返回必须翻转的(