我有形状(N*2)
的矩阵M1
和另一矩阵M2
(2*N)
,我想获得的(N)
结果,每个元件i
是i
第i行的乘积M1
和i
第012列的M2
。 我试图在NumPy的使用点,但它只能给我的矩阵乘法结果,这是(N*N)
,当然,我可以采取对角线这是我想要的,我想知道有没有更好的方式来做到这个?计算产品 - NumPy的
1
A
回答
1
方法#1
您可以使用np.einsum
-
np.einsum('ij,ji->i',M1,M2)
说明:
原来糊涂的解决方案将是这个样子 -
def original_app(M1,M2):
N = M1.shape[0]
out = np.zeros(N)
for i in range(N):
out[i] = M1[i].dot(M2[:,i])
return out
因此,对于每一次迭代,我们有:
out[i] = M1[i].dot(M2[:,i])
在迭代器寻找,我们需要对齐的M1
第一轴线与M2
第二轴线。同样,因为我们正在执行matrix-multiplication
并且由于其本身的定义与的M2
第一轴线对准的M1
第二轴线,并且还总结减少在每一次迭代这些元素。
当移植到einsum
,保持轴的两个输入端之间的对准指定字符串符号给它时具有相同的字符串。所以,输入分别为'ij,ji
,M1
和M2
。从M1
失去第二串后的输出,这是与从在总和还原M2
第一串,应该保留i
。因此,完整的字符串符号将为:'ij,ji->i'
,最终解决方案为:np.einsum('ij,ji->i',M1,M2)
。
方法2
在M1
COLS或行数的在M2
数量是2
。因此,另外,我们就可以切片,进行逐元素乘法和总结这些,就像这样 -
M1[:,0]*M2[0] + M1[:,1]*M2[1]
运行测试
In [431]: # Setup inputs
...: N = 1000
...: M1 = np.random.rand(N,2)
...: M2 = np.random.rand(2,N)
...:
In [432]: np.allclose(original_app(M1,M2),np.einsum('ij,ji->i',M1,M2))
Out[432]: True
In [433]: np.allclose(original_app(M1,M2),M1[:,0]*M2[0] + M1[:,1]*M2[1])
Out[433]: True
In [434]: %timeit original_app(M1,M2)
100 loops, best of 3: 2.09 ms per loop
In [435]: %timeit np.einsum('ij,ji->i',M1,M2)
100000 loops, best of 3: 13 µs per loop
In [436]: %timeit M1[:,0]*M2[0] + M1[:,1]*M2[1]
100000 loops, best of 3: 14.2 µs per loop
大规模加速那里!
相关问题
- 1. numpy有效计算parafac/CP产品
- 2. C#产品计算工具
- 3. 使用LINQ计算产品
- 4. 计算Northwind产品数量
- 5. 衍生产品计算器
- 6. Numpy产品或张量产品问题
- 7. 多输入计算矩阵产品
- 8. 折扣产品的错误计算
- 9. 计算没有IML的内部产品
- 10. Java中的跨产品计算器
- 11. 计算产品累积和的麻烦
- 12. 外部产品计算的向量化
- 13. 只计算magento中的活动产品
- 14. 计算产品的总价值
- 15. numpy元素外部产品
- 16. Numpy的npv计算
- 17. 产品排序计算系数
- 18. 用Java计算点产品距离
- 19. 写SQL查询来计算产品
- 20. Magento - 已计算产品属性(属性)
- 21. Prestashop定制/计算产品价格
- 22. PHP:计算2个变量产品
- 23. Woocommerce - 购物车产品错误计算
- 24. 无税产品价格计算
- 25. 产品统计
- 26. numpy的einsum:嵌套点产品
- 27. 加快multilple矩阵产品numpy的
- 28. 计算 - numpy python bug
- 29. GAE/J现场产品评分的碎片计数器计算
- 30. 建议产品的算法
不错的答案,让我消化了一段时间。爱因斯坦是强大的,但对于初学者来说似乎并不容易理解。 – 1a1a11a
你能解释一点这是如何工作的?我正在阅读文档,很难理解 – 1a1a11a
@ 1a1a11a查看添加的评论是否有意义。 – Divakar