在 numpy 中将 2D 数组广播到 4D 数组
Broadcasting 2D array to 4D array in numpy
我有一个形状 (48, 7)
的二维数组 x
和一个形状 (48, 7, 48, 7)
的 4 维数组 T
。当我乘以 x * T
时,python 广播维度,但不是我预期的方式(实际上,我不明白它是如何广播的)。以下循环将实现我想要的:
for i in range(48):
for j in range(7):
Tx[i, j, :, :] = x[i, j] * T[i, j, :, :]
其中 Tx
是形状为 (48, 7, 48, 7)
的数组。我的问题是,有没有办法使用广播实现相同的结果?
我找到了解决方案。
Python 从最右边的维度广播并向左传播 (source)。
通过转置前两个维度和后两个维度:
T = np.transpose(T, (2,3,0,1))
然后它将按照我预期的方式进行广播。之后,结果数组可以再次转置以恢复原始形状:
Tx = x*T
Tx = np.transpose(Tx, (2,3,0,1))
广播对齐尾随维度。换句话说,x * Tx
是这样做的:
for i in range(48):
for j in range(7):
Tx[:, :, i, j] = x[i, j] * T[:, :, i, j]
要使前导维度对齐,请将单位维度添加到 x
:
Tx = x[..., None, None] * T
或者,您可以使用 np.einsum
明确指定维度:
Tx = np.einsum('ij,ij...->ij...', x, T)
我有一个形状 (48, 7)
的二维数组 x
和一个形状 (48, 7, 48, 7)
的 4 维数组 T
。当我乘以 x * T
时,python 广播维度,但不是我预期的方式(实际上,我不明白它是如何广播的)。以下循环将实现我想要的:
for i in range(48):
for j in range(7):
Tx[i, j, :, :] = x[i, j] * T[i, j, :, :]
其中 Tx
是形状为 (48, 7, 48, 7)
的数组。我的问题是,有没有办法使用广播实现相同的结果?
我找到了解决方案。 Python 从最右边的维度广播并向左传播 (source)。 通过转置前两个维度和后两个维度:
T = np.transpose(T, (2,3,0,1))
然后它将按照我预期的方式进行广播。之后,结果数组可以再次转置以恢复原始形状:
Tx = x*T
Tx = np.transpose(Tx, (2,3,0,1))
广播对齐尾随维度。换句话说,x * Tx
是这样做的:
for i in range(48):
for j in range(7):
Tx[:, :, i, j] = x[i, j] * T[:, :, i, j]
要使前导维度对齐,请将单位维度添加到 x
:
Tx = x[..., None, None] * T
或者,您可以使用 np.einsum
明确指定维度:
Tx = np.einsum('ij,ij...->ij...', x, T)