给定两个矩阵
A: m * r
B: n * r
我想生成另一个矩阵C: m * n
,每个元素C_ij
是由A_i
和B_j
的外积计算的矩阵。
比如说,
A: [[1, 2],
[3, 4]]
B: [[3, 1],
[1, 2]]
给
C: [[[3, 1], [[1 ,2],
[6, 2]], [2 ,4]],
[9, 3], [[3, 6],
[12,4]], [4, 8]]]
我可以用for循环来实现,比如
for i in range (A.shape(0)):
for j in range (B.shape(0)):
C_ij = np.outer(A_i, B_j)
我想知道是否有一种矢量化的方法来加速计算?
5条答案
按热度按时间wnrlj8wa1#
爱因斯坦符号很好地表达了这个问题
v64noz0r2#
NumPy ufunc,比如
multiply
,有一个outer
方法,几乎可以做到你想要的。以下:结果是
temp[a, b, c, d] == A[a, b] * B[c, d]
。你想要C[a, b, c, d] == A[a, c] * B[b, d]
。swapaxes
调用重新排列temp
,以按照您想要的顺序放置它。u3r8eeie3#
使用Numpy数组广播的简单解决方案
因为你想要
C_ij = A_i * B_j
,这可以通过numpy广播column-vector-A和row-vector-B的元素乘积来实现,如下所示:输出:
然后,您可以通过使用
numpy.dsplit()
或numpy.array_split()
获得所需的四个子矩阵,如下所示:输出:
rsaldnfx4#
您可以使用
tensordot
正是你想要的。axes
参数用于在某些轴上执行求和(对于>2dTensor,默认值为2
,它将对每个数组的2个轴求和),但将其设置为0
,它不会减少维度并保留整个外积。au9on6nz5#
使用numpy;
一旦你得到了想要的结果,你可以用
numpy.reshape()
把它塑造成几乎任何你想要的形状;