python - 使用点积将向量矩阵相乘
问题描述
我得到了两个二维矩阵,其中每个单元格都是一个包含三个元素的向量。
我要做的是使用 2D 矩阵乘法,其中当任何单元格相乘时,它需要三元素向量的点积。
如果已经有答案,我的线性代数技能缺乏如此抱歉,我已经查看了许多与 tensordot 和 einsums 相关的页面,但我不明白这些如何适用于我的情况。
这基本上是我得到的:
import numpy as np
ar1 = np.array([[[1,2,3],[3,4,5]],[[5,6,7],[7,8,9]]])
ar2 = np.array([[[2,3,4],[4,5,6]],[[6,7,8],[8,9,10]]])
以下是如何制作我正在寻找的东西:
final = [[0 for x in range(2)] for y in range(2)]
final[0][0] = np.dot(ar1[0][0], ar2[0][0]) + np.dot(ar1[0][1], ar2[1][0])
final[0][1] = np.dot(ar1[0][0], ar2[0][1]) + np.dot(ar1[0][1], ar2[1][1])
final[1][0] = np.dot(ar1[1][0], ar2[0][0]) + np.dot(ar1[1][1], ar2[1][0])
final[1][1] = np.dot(ar1[1][0], ar2[0][1]) + np.dot(ar1[1][1], ar2[1][1])
final
Output: [[106, 142], [226, 310]]
实际上,这些矩阵将在 3000x40000x3 和 40000x40x3 左右,因此非常感谢您考虑速度。谢谢!
解决方案
这是如何做到这一点einsum
np.einsum('ijl,jkl',ar1,ar2)
# array([[106, 142],
# [226, 310]])
与tensordot
np.tensordot(ar1,ar2,((1,2),(0,2)))
# array([[106, 142],
# [226, 310]])
并通过重塑
ar1.reshape(2,-1)@ar2.transpose(0,2,1).reshape(-1,2)
# array([[106, 142],
# [226, 310]])
推荐阅读
- python - 在数据框中切片对象类型的值
- pythonanywhere - 更新为我的 python-Twitter-bot 提供输入的 .csv 文件
- python - Python Pandas 根据时间从列中选择值
- javascript - 从连接表中选择计数
- image - Nuxt 嵌套链接导致图像 404
- node.js - AWS Lambda GitLab CI/CD 部署包大小比从我的本地环境部署大得多
- node.js - 通过 nvm 安装时,节点库在 MacOS 上重新编译很慢
- java - 为什么不可变类中的可变对象可以访问?
- mongodb - MongoDB 聚合 $reduce 运算符出错
- django - 在 ForeignKey 中使用模型名称而不是对象是否存在性能差异?