Ada*_*dam 8 python numpy scipy
我正在寻找一种快速计算n种外部产品总和的方法.
本质上,我从正态分布生成的两个矩阵开始 - 有n个向量与v元素:
A = np.random.normal(size = (n, v))
B = np.random.normal(size = (n, v))
Run Code Online (Sandbox Code Playgroud)
我想要的是计算A和B中每个大小为v的向量的外积并将它们加在一起.
注意A * B.T不起作用 - A的大小为nxv,而B的大小为vx n.
我能做的最好的事情是创建一个外部产品构造的循环,然后再加总.我喜欢它:
outers = np.array([A[i] * B[i].T])
Run Code Online (Sandbox Code Playgroud)
这会创建一个nxvxv数组(循环在列表解析中,随后转换为数组),然后我可以使用它来加总np.sum(outers, axis = 0).然而,这是非常缓慢的,我想知道是否有一个矢量化函数,我可以使用它来加快速度.
如果有人有任何建议,我将非常感激!
Jai*_*ime 10
在我看来,你需要做的就是改变换位的顺序,而A.T * B不是做A * B.T.
如果这不是你想要的,那么看看np.einsum,这可以做一些非常强大的伏都教.对于上面的示例,您将执行以下操作:
np.einsum('ij,ik->jk', A, B)
Run Code Online (Sandbox Code Playgroud)
还考虑一下np.outer。
np.array([np.outer(A, B) for i in xrange(n)]).sum(0)
Run Code Online (Sandbox Code Playgroud)
尽管np.einsum@Jamie 的建议是明显的赢家。
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
Run Code Online (Sandbox Code Playgroud)
可以肯定的是,他们的结果是相同的:
In [65]: np.testing.assert_allclose(method_outer, method_einsum)
Run Code Online (Sandbox Code Playgroud)
但是,顺便说一句,我没有发现这一点A.T * B或A * B.T广播成功。
| 归档时间: |
|
| 查看次数: |
2674 次 |
| 最近记录: |