Numpy 跨矩阵列添加外部产品的更快方法

Numpy 跨矩阵列添加外部产品的更快方法,numpy,vectorization,Numpy,Vectorization,跨矩阵列(矩阵为v)计算外积的更快方法。 因此,当沿着另一个矩阵的列求外积时,增加矩阵的速度更快?使用矩阵乘法及其转置版本- sum_v=np.zeros([d,d]) for i in range(num): sum_v+=np.outer(v[:,i],v[:,i]) 解释:您基本上是在执行v[:,None,:]*v[None,:,:](如果您在每次迭代时打印外部乘积结果并进行研究),然后沿着乘积的最后一个轴执行求和减少。退一步,从输入数组的角度来看,我们正在执行两个版本的v之间的

跨矩阵列(矩阵为v)计算外积的更快方法。
因此,当沿着另一个矩阵的列求外积时,增加矩阵的速度更快?

使用
矩阵乘法及其转置版本-

sum_v=np.zeros([d,d])
for i in range(num):
    sum_v+=np.outer(v[:,i],v[:,i])

解释:您基本上是在执行
v[:,None,:]*v[None,:,:]
(如果您在每次迭代时打印外部乘积结果并进行研究),然后沿着乘积的最后一个轴执行
求和减少。退一步,从输入数组的角度来看,我们正在执行两个版本的
v
之间的元素乘法,这样最后一个轴将保持对齐,并最终减少总和,而剩下的两个轴将作为最终结果的两个轴展开。
求和
基本上是
矩阵乘法
v
及其转置之间。

使用
矩阵乘法
及其转置版本-

sum_v=np.zeros([d,d])
for i in range(num):
    sum_v+=np.outer(v[:,i],v[:,i])

解释:您基本上是在执行
v[:,None,:]*v[None,:,:]
(如果您在每次迭代时打印外部乘积结果并进行研究),然后沿着乘积的最后一个轴执行
求和减少。退一步,从输入数组的角度来看,我们正在执行两个版本的
v
之间的元素乘法,这样最后一个轴将保持对齐,并最终减少总和,而剩下的两个轴将作为最终结果的两个轴展开。
sum reduction
基本上是
v
与其转置之间的矩阵乘法。

如果您熟悉爱因斯坦求和符号,
np.einsum
可以使可视化更容易:

v.dot(v.T)
这与:

sum_v = np.einsum('ik,jk->ij', v, v)

正如@Divakar指出的,
np.einsum('ik,kj->ij',…)
在功能上等同于(并且比)
np.dot(…)

如果你熟悉爱因斯坦求和符号,
np.einsum
可以使可视化更容易:

v.dot(v.T)
这与:

sum_v = np.einsum('ik,jk->ij', v, v)

正如@Divakar指出的,
np.einsum('ik,kj->ij',…)
在功能上等同于(并且比)
np.dot(…)

为什么这是相同的?“你在总结什么?”阿披舍克比亚补充道。看看它们是否有帮助/有意义。为什么是一样的?“你在总结什么?”阿披舍克比亚补充道。看看它们是否有帮助/有意义。