Python-求和外部产品的快速方法?
我正在寻找一种快速的方法来计算n个外积的和 基本上,我从正态分布生成的两个矩阵开始-有n个向量和v个元素:Python-求和外部产品的快速方法?,python,numpy,scipy,Python,Numpy,Scipy,我正在寻找一种快速的方法来计算n个外积的和 基本上,我从正态分布生成的两个矩阵开始-有n个向量和v个元素: A = np.random.normal(size = (n, v)) B = np.random.normal(size = (n, v)) 我想要的是计算A和B中大小为v的每个向量的外积,并将它们相加 请注意,A*B.T不起作用-A的大小为nxv,而B的大小为vxn 我所能做的最好的事情就是创建一个循环,在其中构造外部产品,然后在后面求和。我是这样说的: outers = np.ar
A = np.random.normal(size = (n, v))
B = np.random.normal(size = (n, v))
我想要的是计算A和B中大小为v的每个向量的外积,并将它们相加
请注意,A*B.T
不起作用-A的大小为nxv,而B的大小为vxn
我所能做的最好的事情就是创建一个循环,在其中构造外部产品,然后在后面求和。我是这样说的:
outers = np.array([A[i] * B[i].T])
这将创建一个nxv数组(循环在列表理解中,随后将其转换为数组),然后我可以使用np.sum(outers,axis=0)
将其相加。然而,这是相当缓慢的,我想知道是否有一个矢量化的功能,我可以用来加快这一点
如果有人有任何建议,我将非常感激 在我看来,你所需要做的就是改变换位的顺序,然后做
A.T*B
而不是A*B.T
如果这不完全是你想要的,看看,它可以做一些非常强大的伏都教。对于上面的示例,您将执行以下操作:
np.einsum('ij,ik->jk', A, B)
也考虑<代码> NP.外部< /代码> .<
np.array([np.outer(A, B) for i in xrange(n)]).sum(0)
尽管@Jamie建议的np.einsum
显然是赢家
In [63]: %timeit np.einsum('ij,ik->jk', A, B)
100000 loops, best of 3: 4.61 us per loop
In [64]: %timeit np.array([np.outer(A[i], B[i]) for i in xrange(n)]).sum(0)
10000 loops, best of 3: 169 us per loop
可以肯定的是,他们的结果是一致的:
In [65]: np.testing.assert_allclose(method_outer, method_einsum)
但是,顺便说一句,我没有发现
A.T*B
或A*B.T
广播成功。他是在乘以np.matrix
对象,而不是np.ndarray
sA*B.T
则相当于np.dot(A,B.T)
,而A.T*B
则相当于np.dot(A.T,B)
。它应该非常非常接近np.einsum
+1,以便在这两种方法之间进行很好的比较