我有两个numpy数组:形状(b,i)的 A 和形状(b,o)的 B 。我想计算一个形状(b,i,o)的数组 R , R 的每一行 l 都包含 A 的行 l 和 B 的行 l 。到目前为止我所拥有的是:
import numpy as np
A = np.ones((10, 2))
B = np.ones((10, 6))
R = np.asarray([np.outer(a, b) for a, b in zip(A, B)])
assert R.shape == (10, 2, 6)
我认为这个方法太慢了,因为zip和最终转换成numpy数组。
有更有效的方法吗?
答案 0 :(得分:6)
numpy.matmul
可以实现这一点,它可以实现"矩阵堆栈的乘法"。在这种情况下,我们希望将一堆列向量与一堆行向量相乘。首先将矩阵A带到形状(b,i,1),将B带到形状(b,1,o)。然后使用matmul执行b次外部产品:
import numpy as np
i, b, o = 3, 4, 5
A = np.ones((b, i))
B = np.ones((b, o))
print(np.matmul(A[:, :, np.newaxis], B[:, np.newaxis, :]).shape) # (4, 3, 5)
另一种方法是使用numpy.einsum
,它可以直接代表您的索引符号:
np.einsum('bi,bo->bio', A, B)
答案 1 :(得分:2)
为什么不简单
A[:, :, None] * B[:, None, :]
根据您的约定和您的dtype,您可能需要在某处投入另一个np.conj
。请注意,np.newaxis
只是None