Алмазная маска с заданной длиной матрицы
Вот один из способов усиления broadcasting
-
def diamond(n):
a = np.arange(n)
b = np.minimum(a,a[::-1])
return (b[:,None]+b)>=(n-1)//2
Образцы прогонов -
In [73]: diamond(3)
Out[73]:
array([[False, True, False],
[ True, True, True],
[False, True, False]])
In [74]: diamond(4)
Out[74]:
array([[False, True, True, False],
[ True, True, True, True],
[ True, True, True, True],
[False, True, True, False]])
In [75]: diamond(5)
Out[75]:
array([[False, False, True, False, False],
[False, True, True, True, False],
[ True, True, True, True, True],
[False, True, True, True, False],
[False, False, True, False, False]])
Алмазная маска с заданным радиусом
Для заданного радиуса еще более упрощается -
def diamond2(r):
b = np.r_[:r,r:-1:-1]
return (b[:,None]+b)>=r
И это может быть дополнительно упрощено до однострочного-
def diamond2(r):
return np.add.outer(*[np.r_[:r,r:-1:-1]]*2)>=r
Образцы прогонов -
In [19]: diamond2(1)
Out[19]:
array([[False, True, False],
[ True, True, True],
[False, True, False]])
In [20]: diamond2(2)
Out[20]:
array([[False, False, True, False, False],
[False, True, True, True, False],
[ True, True, True, True, True],
[False, True, True, True, False],
[False, False, True, False, False]])
In [21]: diamond2(3)
Out[21]:
array([[False, False, False, True, False, False, False],
[False, False, True, True, True, False, False],
[False, True, True, True, True, True, False],
[ True, True, True, True, True, True, True],
[False, True, True, True, True, True, False],
[False, False, True, True, True, False, False],
[False, False, False, True, False, False, False]])