假设我有一个一维数组
a = np.array([1, 2, 3])
从 a 获取形状为 (3, 4, 5) 的数组 b 的最佳方法是什么?数组 a 的每个值都用于初始化一个 4x5 数组,堆叠所有这些数组将创建数组 b。我想知道是否可以避免循环创建数组 b。
b = np.array([[[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]], [[2, 2, 2, 2, 2], [2, 2, 2, 2, 2], [2, 2, 2, 2, 2], [2, 2, 2, 2, 2]], [[3, 3, 3, 3, 3], [3, 3, 3, 3, 3], [3, 3, 3, 3, 3], [3, 3, 3, 3, 3]]])
b 的输出:
array([[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[2, 2, 2, 2, 2],
[2, 2, 2, 2, 2],
[2, 2, 2, 2, 2],
[2, 2, 2, 2, 2]],
[[3, 3, 3, 3, 3],
[3, 3, 3, 3, 3],
[3, 3, 3, 3, 3],
[3, 3, 3, 3, 3]]])
numpy.tile
:
b = np.tile(a[:, None, None], (1, 4, 5))
输出:
array([[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[2, 2, 2, 2, 2],
[2, 2, 2, 2, 2],
[2, 2, 2, 2, 2],
[2, 2, 2, 2, 2]],
[[3, 3, 3, 3, 3],
[3, 3, 3, 3, 3],
[3, 3, 3, 3, 3],
[3, 3, 3, 3, 3]]])
您可以通过创建一个数组并将其乘以
a[:,None,None]
来使用广播来实现。
import numpy as np
a = np.array([1, 2, 3])
b = np.ones((3,4,5), dtype=int)*a[:,None,None]
np.broadcast_to
创建数组的情况下执行此操作。
import numpy as np
a = np.array([1, 2, 3])
b = np.broadcast_to(a[:,None,None], (3,4,5))