Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-求和外部产品的快速方法?_Python_Numpy_Scipy - Fatal编程技术网

Python-求和外部产品的快速方法?

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

我正在寻找一种快速的方法来计算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.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
s
A*B.T
则相当于
np.dot(A,B.T)
,而
A.T*B
则相当于
np.dot(A.T,B)
。它应该非常非常接近
np.einsum
+1,以便在这两种方法之间进行很好的比较