首页 > 解决方案 > 构建二维金字塔数组 - 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],

(并且可以采用奇数参数)

任何建议将不胜感激,谢谢!

标签: pythonnumpyvectorization

解决方案


方法#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]])

推荐阅读