Подход № 1
Мы можем использовать broadcasting
-
def pyramid(n):
r = np.arange(n)
d = np.minimum(r,r[::-1])
return np.minimum.outer(d,d)
Подход № 2
Мы также можем использовать concatenation
для создания d
, вот так -
d = np.r_[np.arange(n//2),np.arange(n//2-(n%2==0),-1,-1)]
Таким образом, давая нам альтернативный однострочный -
np.minimum.outer(*(2*[np.r_[np.arange(n//2),np.arange(n//2-(n%2==0),-1,-1)]]))
Образецработает -
In [83]: pyramid(5)
Out[83]:
array([[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 2, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0]])
In [84]: pyramid(6)
Out[84]:
array([[0, 0, 0, 0, 0, 0],
[0, 1, 1, 1, 1, 0],
[0, 1, 2, 2, 1, 0],
[0, 1, 2, 2, 1, 0],
[0, 1, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 0]])
In [85]: pyramid(8)
Out[85]:
array([[0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 1, 1, 1, 1, 1, 0],
[0, 1, 2, 2, 2, 2, 1, 0],
[0, 1, 2, 3, 3, 2, 1, 0],
[0, 1, 2, 3, 3, 2, 1, 0],
[0, 1, 2, 2, 2, 2, 1, 0],
[0, 1, 1, 1, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 0]])