numpy 如何用 einsum 实现高效的矩阵运算(爱因斯坦求和)

发布时间 - 2026-01-24 00:00:00    点击率:
einsum字符串需确保输入维度标签与输出标签严格匹配,字母顺序须与张量ndim一致,重复字母表求和或对角线,跨输入重复触发求和,空输出表示标量,省略号要求前缀维度对齐。

einsum 字符串怎么写才不报错

核心是让输入张量的维度标签和输出标签严格匹配,einsum 不会自动广播或对齐轴,写错一个字母就直接抛 ValueError: operands could not be broadcast togetherIndexError

  • 每个输入张量用一串字母(如 "ij""jk")表示其形状,字母顺序必须和 ndim 一致
  • 输出标签必须是所有输入中出现过的字母子集;没出现在输出里的字母,就代表要沿该轴求和
  • 重复字母只在同一个输入中允许(如 "ii" 表示对角线),跨输入重复则触发求和(如 "ij,jk" 中的 j
  • 空输出(如 "ii->")表示标量结果,不能漏掉箭头后的空字符串

替代 dot / matmul 的常见写法

多数矩阵乘、转置、迹运算都能用 einsum 更清晰地表达,且避免临时数组分配。

  • 矩阵乘 A @ Bnp.einsum("ij,jk->ik", A, B)(比 dot 更显式控制哪维参与计算)
  • 批量矩阵乘 B @ C,其中 B.shape = (b, i, j), C.shape = (b, j, k)np.einsum("bij,bjk->bik", B, C)
  • 提取对角线 np.diag(A)np.einsum("ii->i", A);求迹 → np.einsum("ii->", A)
  • 外积 np.outer(u, v)np.einsum("i,j->ij", u, v)

为什么有时比内置函数还慢

einsum 默认走通用路径,对简单操作(如二维矩阵乘)不如高度优化的 BLAS 后端快;是否加速取决于操作复杂度和数据规模。

  • 小矩阵():通常 matmuldot 更快,einsum 有解析字符串开销
  • 高维或带求和+广播混合的操作(如 "ab,cd,be->acde"):einsum 可能显著胜出,因避免多个中间数组
  • optimize=True(如 np.einsum("...,...->...", A, B, optimize=True))可启用路径优化,对三阶及以上张量尤其重要
  • 注意:optimize="greedy""optimal" 会增加预处理时间,仅当反复调用同结构时值得开启

容易被忽略的内存与 dtype 陷阱

einsum 默认按输入中最高精度 dtype 输出,但不会自动提升整数精度;同时,它不共享内存,结果总是新分配数组。

  • 两个 int32 矩阵相乘,结果仍是 int32,可能溢出;需显式转成 float64 或用 dtype=np.float64 参数指定
  • 传入视图(如切片)时,输出一定是副本,无法通过 out= 参数复用内存(einsum 不支持 out 参数)
  • 含省略号 ... 时(如 "...ij,...jk->...ik"),要确保前缀维度完全对齐,否则运行时报错而非静默截断
实际用的时候,先手写一个最简 einsum 版本验证逻辑,再测性能;别为了“看起来高级”硬套,尤其是二维场景下 @ 还是最稳的。


# 后端  # 为什么  # numpy  # 字符串  # 切片  # 尤其是  # 多个  # 出现在  # 仍是  # 更快  # 不支持  # 只在  # 报错  # 而非  # 它不 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现一对一模型关联?(Eloquent示例)  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  如何自定义建站之星模板颜色并下载新样式?  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  如何在香港免费服务器上快速搭建网站?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  如何在万网自助建站中设置域名及备案?  如何彻底卸载建站之星软件?  Laravel如何优化应用性能?(缓存和优化命令)  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  如何在 React 中条件性地遍历数组并渲染元素  Laravel如何升级到最新版本?(升级指南和步骤)  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  WordPress 子目录安装中正确处理脚本路径的完整指南  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  如何快速查询网站的真实建站时间?  网站制作软件有哪些,制图软件有哪些?  如何在阿里云高效完成企业建站全流程?  教学论文网站制作软件有哪些,写论文用什么软件 ?  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  简历在线制作网站免费版,如何创建个人简历?  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  Android 常见的图片加载框架详细介绍  linux写shell需要注意的问题(必看)  如何快速搭建FTP站点实现文件共享?  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  如何在建站宝盒中设置产品搜索功能?  香港网站服务器数量如何影响SEO优化效果?  高防服务器如何保障网站安全无虞?  微信小程序 canvas开发实例及注意事项  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  Java类加载基本过程详细介绍  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  怎么用AI帮你为初创公司进行市场定位分析?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  linux top下的 minerd 木马清除方法  Android Socket接口实现即时通讯实例代码  如何用VPS主机快速搭建个人网站?  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  Laravel怎么调用外部API_Laravel Http Client客户端使用  实现点击下箭头变上箭头来回切换的两种方法【推荐】  C#如何调用原生C++ COM对象详解  青岛网站建设如何选择本地服务器?