Lei*_* Yu 11 python numpy matrix
鉴于两个矩阵
A: m * r
B: n * r
Run Code Online (Sandbox Code Playgroud)
我想以产生另一矩阵C: m * n,每个条目C_ij是由外积计算的矩阵A_i和B_j.
例如,
A: [[1, 2],
[3, 4]]
B: [[3, 1],
[1, 2]]
Run Code Online (Sandbox Code Playgroud)
给
C: [[[3, 1], [[1 ,2],
[6, 2]], [2 ,4]],
[9, 3], [[3, 6],
[12,4]], [4, 8]]]
Run Code Online (Sandbox Code Playgroud)
我可以使用for循环来做,比如
for i in range (A.shape(0)):
for j in range (B.shape(0)):
C_ij = np.outer(A_i, B_j)
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一种矢量化的方法来进行此计算以加快速度?
hpa*_*ulj 14
爱因斯坦符号很好地表达了这个问题
In [85]: np.einsum('ac,bd->abcd',A,B)
Out[85]:
array([[[[ 3, 1],
[ 6, 2]],
[[ 1, 2],
[ 2, 4]]],
[[[ 9, 3],
[12, 4]],
[[ 3, 6],
[ 4, 8]]]])
Run Code Online (Sandbox Code Playgroud)
temp = numpy.multiply.outer(A, B)
C = numpy.swapaxes(temp, 1, 2)
Run Code Online (Sandbox Code Playgroud)
NumPy ufuncs,例如multiply,有一种outer几乎可以做你想要的方法.下列:
temp = numpy.multiply.outer(A, B)
Run Code Online (Sandbox Code Playgroud)
产生这样的结果temp[a, b, c, d] == A[a, b] * B[c, d].你想要的C[a, b, c, d] == A[a, c] * B[b, d].该swapaxes呼叫重新排列temp,以把它放在你想要的顺序.