根据提供的模式生成三维numpy数组



你能告诉我是否有任何"智能"方法可以根据提供的模式生成3D numpy数组吗?让我解释一下我的意思。例如,如果图案为[1, 4, 6, 4, 1],则其对应的2D阵列为:

[
[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在"立方体"的中心,二十六个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循环的原因,它随层数的变化而变化不大。虽然在这个应用程序中对for循环进行矢量化肯定有些过头了,但如果有人有想法的话,我愿意接受建议。

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

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]])