根据提供的模式生成 3D numpy 数组

Generate 3D numpy array based on provided pattern

你能告诉我是否有任何 'smart' 方法可以根据提供的模式生成 3D numpy 数组吗?让我解释一下我的意思。例如,如果模式是 [1, 4, 6, 4, 1],则对应的二维数组将是:

[
    [1, 1, 1, 1, 1],
    [1, 4, 4, 4, 1],
    [1, 4, 6, 4, 1],
    [1, 4, 4, 4, 1],
    [1, 1, 1, 1, 1]
]

3D数组与2D类似。如果您将 3D 数组想象成一个立方体:只有一个 6 在 'cube' 的中心,二十六个 4 在最近的邻域中,其余的 1秒。 对于可能令人困惑的解释,我深表歉意,我不是以英语为母语的人。请询问是否有不清楚的地方。 谢谢!

可以使用任何 python 库。

您可以使用 numpy.pad 在您的中心数字周围一层一层地添加“层”(就像洋葱(嗯,实际上是非常立方的洋葱)):

pattern = [1,4,6]

x = np.array(pattern[-1]).reshape([1,1,1])
for p in reversed(pattern[:-1]):
    x = np.pad(x, mode='constant', constant_values=p, pad_width=1)
    
print(x)
#[[[1 1 1 1 1]
#  [1 1 1 1 1]
#  [1 1 1 1 1]
#  [1 1 1 1 1]
#  [1 1 1 1 1]]
#
# [[1 1 1 1 1]
#  [1 4 4 4 1]
#  [1 4 4 4 1]
#  [1 4 4 4 1]
#  [1 1 1 1 1]]
#
# [[1 1 1 1 1]
#  [1 4 4 4 1]
#  [1 4 6 4 1]
#  [1 4 4 4 1]
#  [1 1 1 1 1]]
#
# [[1 1 1 1 1]
#  [1 4 4 4 1]
#  [1 4 4 4 1]
#  [1 4 4 4 1]
#  [1 1 1 1 1]]
#
# [[1 1 1 1 1]
#  [1 1 1 1 1]
#  [1 1 1 1 1]
#  [1 1 1 1 1]
#  [1 1 1 1 1]]]

上面的代码应该适用于任意数量的层(事实上,如果您调整形状,它也适用于任意数量的维度)。然而,由于 for-loop,它随着层数的增加而扩展不佳。虽然在此应用程序中对这个 for-loop 进行矢量化肯定是过大的杀伤力,但如果有人有想法,我愿意征求建议。

棘手的部分是生成与模式匹配的索引。以下内容适用于回文:

a = np.array([1,4,6,4,1])
i = np.ceil((np.r_[:2, 2:-1:-1][:, None] * np.r_[:2, 2:-1:-1]) / 2).astype(int)
a[i]

输出:

array([[1, 1, 1, 1, 1],
       [1, 4, 4, 4, 1],
       [1, 4, 6, 4, 1],
       [1, 4, 4, 4, 1],
       [1, 1, 1, 1, 1]])