einops

GitHub
9.5k 397 非常简单 1 次阅读 今天MIT开发框架
AI 解读 由 AI 自动生成,仅供参考

einops 是一个专为深度学习设计的张量操作库,旨在让代码更简洁、易读且可靠。它支持 PyTorch、JAX、TensorFlow、NumPy、MLX 等多种主流框架,提供了一套统一且强大的接口来处理高维张量。

在深度学习研发中,开发者常需对张量进行重塑、转置、合并或拆分等操作。传统写法往往依赖晦涩的维度索引或冗长的链式调用,不仅难以阅读,还容易出错。einops 通过引入类似爱因斯坦求和约定(einsum)的声明式语法,让用户能用直观的符号描述张量变换逻辑,大幅降低理解成本和维护难度。无论是复杂的注意力机制还是多维数据重组,都能用寥寥数行清晰表达。

该工具特别适合 AI 研究人员、算法工程师及深度学习开发者使用,尤其是那些频繁处理高维张量、追求代码优雅性与复现性的群体。其独特亮点包括:原生支持多种后端框架、无缝兼容 torch.compile 加速、内置 Packing/Unpacking 高级操作,以及被 ICLR 2022 收录的学术背书。此外,社区中还提供了交互式教程和在线实验环境,帮助用户快速上手。如果你正在为繁琐的张量操作头疼,einops 或许能显著提升你的开发效率与代码质量。

使用场景

一位计算机视觉工程师正在开发基于 Vision Transformer (ViT) 的图像分类模型,需要频繁处理图像块(Patches)与序列维度之间的复杂张量变换。

没有 einops 时

  • 代码可读性差:依赖晦涩的 viewtransposepermute 组合,其他开发者难以一眼看出张量形状的具体变化逻辑。
  • 维护成本高昂:硬编码的维度索引(如 x.shape[1])在模型结构调整时极易出错,导致“维度不匹配”的运行时崩溃。
  • 框架迁移困难:从 PyTorch 迁移到 JAX 或 TensorFlow 时,必须重写所有底层张量操作代码,因为不同框架的 API 存在差异。
  • 调试效率低下:需要在代码中插入大量 print(tensor.shape) 来追踪中间状态,才能定位数据流向错误。

使用 einops 后

  • 逻辑声明式表达:通过 rearrange(x, 'b c (h p1) (w p2) -> b (h w) (p1 p2 c)', ...) 这种类似数学公式的语法,直观描述维度拆分与合并,代码即文档。
  • 鲁棒性显著增强:不再依赖具体的数字索引,只要维度名称匹配,即使批量大小或图像分辨率变化,代码也能自动适应,减少报错。
  • 无缝框架切换:同一套 einops 代码可直接运行于 PyTorch、JAX、TensorFlow 等多种后端,无需修改任何算子调用,极大降低迁移门槛。
  • 开发心流顺畅:开发者只需关注数据逻辑而非底层内存布局,消除了繁琐的形状计算,将更多精力投入模型架构创新。

einops 将易错的张量“杂技”转化为清晰可靠的声明式代码,是深度学习工程师提升研发效率与代码质量的必备利器。

运行环境要求

GPU

未说明

内存

未说明

依赖
noteseinops 是一个纯 Python 库,不强制依赖特定的深度学习框架,而是作为通用层支持多种后端(如 PyTorch, TensorFlow, JAX, NumPy 等)。它兼容遵循 Python Array API 标准的任何框架。安装仅需执行 'pip install einops',无特殊硬件或系统要求。
python3.8+
numpy
pytorch
tensorflow
jax
cupy
flax
paddle
oneflow
tinygrad
mlx
einops hero image

快速开始

https://user-images.githubusercontent.com/6318811/177030658-66f0eb5d-e136-44d8-99c9-86ae298ead5b.mp4

einops

运行测试 PyPI 版本 文档 支持的 Python 版本

灵活且强大的张量操作,让代码更易读、更可靠。
支持 NumPy、PyTorch、JAX、MLX 等多种框架。

最新更新:

  • einops 演示环境 可以直接在浏览器中运行其中的 2 个示例笔记本
  • 0.8.2:新增 MLX 后端
  • 0.8.0:新增 Tinygrad 后端,并进行了一些小修复
  • 0.7.0:无需繁琐配置即可使用 torch.compile,支持 Array API 标准,以及其他改进
  • 10,000🎉:GitHub 报告称已有超过 1 万个项目在使用 einops
  • einops 0.6.1:新增 Paddle 后端
  • einops 0.6 引入了 打包与解包
  • einops 0.5:einsum 现已成为 einops 的一部分
  • Einops 论文 被 ICLR 2022 接受为口头报告(确实值得一读)。演讲录像已公开
往期更新 - 新增 Flax 和 OneFlow 后端 - 支持 PyTorch 层的 `torch.jit.script` - 在 einops 中加入了功能强大的 EinMix。[Einmix 教程笔记本](https://github.com/arogozhnikov/einops/blob/main/docs/3-einmix-layer.ipynb)

推文

如果你还需要理由来花时间学习 einsum 和 einops... Tim Rocktäschel

使用 PyTorch 和 einops 编写更好的代码 👌 Andrej Karpathy

einops 正在慢慢渗透到我代码的每一个角落。如果你经常需要处理高维张量,它可能会改变你的工作方式。 Nasim Rahaman

更多评价

目录

安装

非常简单:

pip install einops

(uv pip install einops 也同样适用)

教程

教程是了解 einops 实际应用的最佳方式

Kapil Sachdeva 录制了一个简短的 einops 入门视频

API

einops 拥有极简但功能强大的 API。

提供了三项核心操作(einops 教程展示了这些操作可以覆盖堆叠、重塑、转置、挤压/扩展、重复、平铺、拼接、视图以及多种约简操作):

from einops import rearrange, reduce, repeat
# 按照指定模式重新排列元素
output_tensor = rearrange(input_tensor, 't b c -> b c t')
# 结合重新排列和约简操作
output_tensor = reduce(input_tensor, 'b c (h h2) (w w2) -> b h w c', 'mean', h2=2, w2=2)
# 沿新轴复制
output_tensor = repeat(input_tensor, 'h w -> h w c', c=3)

后来又增加了 packunpack 函数(比传统的堆叠/拆分/拼接更优):

from einops import pack, unpack
# pack 和 unpack 可以将多个张量可逆地“打包”成一个张量。
# 被打包的张量可以具有不同的维度:
packed, ps = pack([class_token_bc, image_tokens_bhwc, text_tokens_btc], 'b * c')
class_emb_bc, image_emb_bhwc, text_emb_btc = unpack(transformer(packed), ps, 'b * c')

最后,einops 还提供了支持多字母变量名的 einsum:

from einops import einsum, pack, unpack
# einsum 就像……einsum,是一种通用且灵活的点积运算,
# 不过 1) 轴可以使用多字母名称 2) 模式放在最后 3) 支持多种框架
C = einsum(A, B, 'b t1 head c, b t2 head c -> b head t1 t2')

EinMix

EinMix 是一种通用的线性层,非常适合 MLP Mixer 等架构。

Einops 提供了层(einops 为每个框架保留单独的版本),这些层反映了相应的函数:

from einops.layers.torch      import Rearrange, Reduce
from einops.layers.tensorflow import Rearrange, Reduce
from einops.layers.flax       import Rearrange, Reduce
from einops.layers.paddle     import Rearrange, Reduce
在 PyTorch 模型中使用层的示例 此处以 PyTorch 为例,但其他框架中的代码几乎相同。
from torch.nn import Sequential, Conv2d, MaxPool2d, Linear, ReLU
from einops.layers.torch import Rearrange

model = Sequential(
    ...,
    Conv2d(6, 16, kernel_size=5),
    MaxPool2d(kernel_size=2),
    # 无需编写 forward 方法即可完成展平
    Rearrange('b c h w -> b (c h w)'),
    Linear(16*5*5, 120),
    ReLU(),
    Linear(120, 10),
)

不再需要手动展平!

此外,PyTorch 的层是可脚本化和可编译的。操作可以被 torch.compile 编译, 但由于 torch.jit.script 的限制,无法进行脚本化。

名称

einops 代表受爱因斯坦启发的操作记号法, 尽管“爱因斯坦操作”听起来更吸引人且更容易记住。

这种记号法大致受到爱因斯坦求和约定的启发(特别是 numpy.einsum 操作)。

为什么使用 einops 记号法?!

语义信息(明确期望)

y = x.view(x.shape[0], -1)
y = rearrange(x, 'b c h w -> b (c h w)')

虽然这两行代码在 某些 情境下执行相同的操作, 但第二行提供了关于输入和输出的信息。换句话说,einops 关注接口:输入和输出是什么,而不是 如何计算输出

下一个操作看起来类似:

y = rearrange(x, 'time c h w -> time (c h w)')

但它给读者一个提示: 我们处理的不是独立的一批图像, 而是一个序列(视频)。

语义信息使代码更易于阅读和维护。

方便的检查

再看同一个例子:

y = x.view(x.shape[0], -1) # x: (batch, 256, 19, 19)
y = rearrange(x, 'b c h w -> b (c h w)')

第二行会检查输入是否具有四个维度, 你还可以指定具体的维度。 这与仅仅写形状注释不同,因为注释并不能防止错误, 而且如果没有经过代码审查,很容易过时。

y = x.view(x.shape[0], -1) # x: (batch, 256, 19, 19)
y = rearrange(x, 'b c h w -> b (c h w)', c=256, h=19, w=19)

结果严格确定

下面我们至少有两种方式来定义深度转空间操作:

# 深度转空间
rearrange(x, 'b c (h h2) (w w2) -> b (c h2 w2) h w', h2=2, w2=2)
rearrange(x, 'b c (h h2) (w w2) -> b (h2 w2 c) h w', h2=2, w2=2)

实际上还有至少四种其他方式。那么框架到底使用哪一种呢?

这些细节通常会被忽略,因为通常不会产生影响, 但在某些情况下(例如在下一阶段使用分组卷积时)可能会有很大差异, 而你希望在代码中明确指定这一点。

统一性

reduce(x, 'b c (x dx) -> b c x', 'max', dx=2)
reduce(x, 'b c (x dx) (y dy) -> b c x y', 'max', dx=2, dy=3)
reduce(x, 'b c (x dx) (y dy) (z dz) -> b c x y z', 'max', dx=2, dy=3, dz=4)

这些示例表明,我们不需要为 1D/2D/3D 池化分别定义不同的操作, 它们都可以用统一的方式定义。

空间转深度和深度转空间在许多框架中都有定义,那宽度转高度呢?如下所示:

rearrange(x, 'b c h (w w2) -> b c (h w2) w', w2=2)

框架无关的行为

即使是简单的函数,在不同框架中也有不同的定义:

y = x.flatten() # 或 flatten(x)

假设 x 的形状是 (3, 4, 5),那么 y 的形状将是……

  • NumPy、PyTorch、CuPy、Chainer、JAX:(60,)
  • Keras、TensorFlow Layers、Gluon:(3, 20)

einops 在所有框架中都以相同的方式工作。

框架术语的独立性

例如,“tile”和“repeat”常常让人困惑。要沿宽度复制图像:

np.tile(image, (1, 2))    # 在 NumPy 中
image.repeat(1, 2)        # PyTorch 的 repeat 类似于 NumPy 的 tile

使用 einops,你就不需要去弄清楚是哪个轴被重复了:

repeat(image, 'h w -> h (tile w)', tile=2)  # 在 NumPy 中
repeat(image, 'h w -> h (tile w)', tile=2)  # 在 PyTorch 中
repeat(image, 'h w -> h (tile w)', tile=2)  # 在 TensorFlow 中
repeat(image, 'h w -> h (tile w)', tile=2)  # 在 JAX 中
repeat(image, 'h w -> h (tile w)', tile=2)  # 在 CuPy 中
... (等等)

用户评价提供了用户对同一问题的看法。

支持的框架

Einops 支持以下框架:

from einops import rearrange  
=> from einops.array_api import rearrange

但实际上更好:einops 可以与任何支持 Python 数组 API 标准 的框架一起使用, 例如:

开发

提供了 Devcontainer 环境,可以在本地、服务器上或 GitHub Codespaces 中使用。 要在 VS Code 中使用 Devcontainer,只需克隆仓库并点击“在 Devcontainer 中重新打开”。

einops 0.8.1 开始,einops 将测试作为包的一部分分发。

# pip install einops pytest
python -m einops.tests.run_tests numpy pytorch jax --pip-install

numpy pytorch jax 只是一个 示例,可以提供任何可测试框架的子集。 每个框架都会与 NumPy 进行对比测试,因此这是测试的前提条件。

指定 --pip-install 会在当前虚拟环境中安装依赖项, 如果本地已安装依赖,则应省略该选项。

构建和测试文档:

hatch run docs:serve  # 在 http://localhost:8000/ 上提供服务

引用 einops

请使用以下 BibTeX 条目:

@inproceedings{
    rogozhnikov2022einops,
    title={Einops: 基于爱因斯坦求和约定的清晰可靠的张量操作},
    author={Alex Rogozhnikov},
    booktitle={国际表示学习会议},
    year={2022},
    url={https://openreview.net/forum?id=oapKSVM2bcj}
}

支持的 Python 版本

einops 支持 Python 3.10 及更高版本。

版本历史

v0.8.22026/01/26
v0.8.12025/02/09
v0.8.02024/04/28
v0.7.02023/10/01
v0.7.0rc22023/08/14
v0.7.0rc12023/07/08
v0.6.2rc02023/07/05
v0.6.12023/04/19
v0.6.02022/11/09
v0.5.02022/10/03
v0.4.12022/03/04
v0.4.02022/01/18
v0.3.22021/08/31
v0.32020/09/08
v0.22020/02/15
v0.12018/11/01

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|3天前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|3天前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

146.8k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.1k|★★☆☆☆|今天
开发框架图像Agent

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|2天前
插件开发框架

LLMs-from-scratch

LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备

90.1k|★★★☆☆|2天前
语言模型图像Agent