构建二维金字塔数组 - Python / NumPy
Build 2d pyramidal array - Python / NumPy
一段时间以来,我一直在绞尽脑汁制作这个数组,但未能以矢量化方式成功完成。
我需要一个函数,它接受大小为 n 的二维数组并生成大小为 (n, n) 的二维数组,如下所示:
n = 6
np.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],
(并且可以接受奇数个参数)
如有任何建议,将不胜感激,谢谢!
使用numpy.pad
:
import numpy as np
def pyramid(n):
if n % 2:
arr = np.zeros((1,1))
N = int((n-1)/2)
else:
arr = np.zeros((2,2))
N = int(n/2)-1
for i in range(N):
arr += 1
arr = np.pad(arr, 1, mode='constant')
return arr
输出:
pyramid(6)
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.]])
pyramid(5)
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.]])
numpy.pad(arr, 1, 'constant')
returns arr
用 1 层零包裹。
方法 #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]])
一段时间以来,我一直在绞尽脑汁制作这个数组,但未能以矢量化方式成功完成。
我需要一个函数,它接受大小为 n 的二维数组并生成大小为 (n, n) 的二维数组,如下所示:
n = 6
np.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],
(并且可以接受奇数个参数)
如有任何建议,将不胜感激,谢谢!
使用numpy.pad
:
import numpy as np
def pyramid(n):
if n % 2:
arr = np.zeros((1,1))
N = int((n-1)/2)
else:
arr = np.zeros((2,2))
N = int(n/2)-1
for i in range(N):
arr += 1
arr = np.pad(arr, 1, mode='constant')
return arr
输出:
pyramid(6)
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.]])
pyramid(5)
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.]])
numpy.pad(arr, 1, 'constant')
returns arr
用 1 层零包裹。
方法 #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]])