如何在python(numpy)中每行更快地计算两个矩阵A和B的外积?

时间:2016-11-15 14:28:32

标签: python-2.7 numpy matrix

假设我们有两个矩阵A和B.

A具有形状(r,k),B具有形状(r,l)。

现在我想计算每行这两个矩阵的np.outer乘积。在外部产品之后,我想要对轴0中的所有值求和。所以我的结果矩阵应该具有形状(k,l)。

例如为: A的形式是(4,2),B的形式是(4,3)。

import numpy as np

A = np.array([[0, 7], [4, 1], [0, 2], [0, 5]])
B = np.array([[9, 7, 7], [6, 7, 5], [2, 7, 9], [6, 9, 7]])

# This is the first outer product for the first values of A and B
print(np.outer(A[0], B[0])) # This will give me 

# First possibility is to use list comprehension and then
sum1 = np.sum((np.outer(x, y) for x, y in zip(A, B)), axis=0)

# Second possibility would be to use the reduce function
sum2 = reduce(lambda sum, (x, y): sum+np.outer(x, y), zip(A, B), np.zeros((A.shape[1], B.shape[1])))

# result for sum1 or sum2 looks like this:
# array([[ 175.,  156.,  133.], [ 133.,  131.,  137.]])

我问自己,有更好或更快的解决方案吗?因为当我有例如两个超过10,000行的矩阵需要一些时间。

只使用np.outer函数不是解决方案,因为np.outer(A,B)会给我一个形状矩阵(8,12)(这不是我想要的)。

需要这个用于神经网络反向传播。

1 个答案:

答案 0 :(得分:1)

您可以将迭代器字符串表示为np.einsum -

np.einsum('rk,rl->kl',A,B)

或使用np.dot -

进行矩阵乘法
A.T.dot(B)