欢迎关注我的微信公号:小张Python

einsum 全称 Einstein summation convention(爱因斯坦求和约定),用简单的方式来代表多维数组运算;

矩阵求各元素之和
A=∑i=0n∑j=0naiajA = \sum_{i=0}^n\sum_{j=0}^na_ia_j A=i=0∑n​j=0∑n​ai​aj​
如果用 einsum函数可表示为

A = np.einsum('i',a)

多矩阵相乘
Cik=∑j=1nAijBjkC_{ik} = \sum_{j=1}^nA_{ij}B_{jk} Cik​=j=1∑n​Aij​Bjk​
表示为

C_i = np.einsum('ij,jk',a,b)

求矩阵的迹
trace=∑i=1nAiitrace = \sum_{i=1}^nA_{ii} trace=i=1∑n​Aii​
用 einsum函数可表示为

trace = np.einsum('ii',a)

对于数组间运算例如矩阵乘积和、沿某一轴点积和;enisum 为多维数组运算提供另外一种表示方式,指定的下标标签列表,用逗号隔开;enisum 函数在 numpy ,Pytorch,Tensorflow 都有实现,使用方式如下

np.einsum(subscripts:str,operands:list of array_like)

函数中参数 subscripts 为字符串类型,表示运算命令,例如 "ii","ij,jk" 参数 operands 代表需要计算的数组或数组列表;

enisum 中 subscrpts 参数的字符串形式有两种方式:

1,implicit(隐式模式) 不包含-> 标识符和输出标签;输出数组会根据选择的下标顺序进行排序,例如 np.einsum('ij',a) 得到的二维数组无变化,但 np.einsum('ji',a) 需要对输出数组进行转置 (i ,j 轴互换)操作

2,explicit(显式模式) 包含 标识符->及输出标签,能够增加函数的灵活性,例如调用 np.einsum('i->',a) 效果类似于 np.sum(a,axis = -1) ;而 np.einsum('ii->i',a) 等同于 np.diag(a) ;另外在显式模式中,会直接指定输出数组下标顺序,例如 np.einsum('ij,jh->ih',a,b) 表示矩阵相乘;目前下面运算都可用 enisum 函数表示;

  • 求一个数组的迹,numpy.trace;
  • 返回对角线,numpy.diag
  • 对数组沿某个轴求和,numpy.sum
  • 数组转置,numpy.transpose
  • 矩阵相乘或点积,numpy.matmul,numpy.dot
  • 向量内积外积,numpy.inner,numpy.outer
  • 广播,逐像素相乘,或标量相乘,numpy.multiply
  • 张量收缩,numpy.tensorbot

关于 np.enisum() 函数举几个栗子:

>>> a = np.arange(25).reshape(5,5)
>>> b = np.arange(5)
>>> c = np.arange(6).reshape(2,3)

1,计算矩阵的迹

>>> np.einsum('ii...->...i',a)
array([-0.796318  ,  0.08363816, -0.79171551,  0.36235911])
>>> np.einsum('i...i',a)
-1.1420362461348776
>>> a
array([[-0.796318  ,  1.54759498, -0.744291  ,  0.02107445],[ 0.03826498,  0.08363816,  0.92709203,  0.04769788],[ 0.39088153, -0.85566069, -0.79171551, -1.50750047],[-1.16165527,  0.77327936,  0.44133708,  0.36235911]])
>>> np.trace(a)
-1.1420362461348776

2,矩阵相乘

>>> b =np.random.rand(4,5)
>>> np.einsum('ij...,jk...->ik...',a,b)
array([[-0.207485  ,  0.37929742, -1.14191507, -0.30398675, -0.59431733],[ 0.03389816,  0.10101184,  0.78917293,  0.41502013,  0.37634113],[-0.3499671 , -0.45043889, -1.67700784, -0.68798725, -0.49966522],[-0.2186732 , -0.30529867, -0.21863002,  0.02300085, -0.50540297]])
>>> np.matmul(a,b)
array([[-0.207485  ,  0.37929742, -1.14191507, -0.30398675, -0.59431733],[ 0.03389816,  0.10101184,  0.78917293,  0.41502013,  0.37634113],[-0.3499671 , -0.45043889, -1.67700784, -0.68798725, -0.49966522],[-0.2186732 , -0.30529867, -0.21863002,  0.02300085, -0.50540297]])

3,对角线 diag

>>> np.einsum('ii->i',a)
array([ 0,  6, 12, 18, 24])
>>> np.diag(a)
array([ 0,  6, 12, 18, 24])

4,沿数组某一轴求和(需要在 explicit 模式下运行)

>>> # 沿着某一轴求和,显示模式运行
>>> np.einsum('ij->i',a)
array([ 10,  35,  60,  85, 110])
d
>>> np.sum(a,axis = 1)
array([ 10,  35,  60,  85, 110])

5,数组转置,改变轴顺序

>>> # 计算数组转置,对某些轴重新排序
>>> c
array([[0, 1, 2],[3, 4, 5]])
>>> np.einsum('ji',c)
array([[0, 3],[1, 4],[2, 5]])
>>> np.transpose(c)
array([[0, 3],[1, 4],[2, 5]])

6,inner(计算内积)

>>> np.einsum('i,i',b,b)
30
>>> b
array([0, 1, 2, 3, 4])
>>> np.inner(b,b)# 一维数组,逐像素乘积和
30

7,矩阵点乘

>>> np.einsum('ij,j',a,b)
array([ 30,  80, 130, 180, 230])
>>> np.dot(a,b)
array([ 30,  80, 130, 180, 230])
>>> a
array([[ 0,  1,  2,  3,  4],[ 5,  6,  7,  8,  9],[10, 11, 12, 13, 14],[15, 16, 17, 18, 19],[20, 21, 22, 23, 24]])
>>> b
array([0, 1, 2, 3, 4])
>>> np.dot(a[-1],b)# Test
230

8,张量数组相乘

>>> np.einsum(',ij',3,c)
array([[ 0,  3,  6],[ 9, 12, 15]])
>>> np.multiply(3,c)
array([[ 0,  3,  6],[ 9, 12, 15]])
>>> # 向量外积

8,广播机制,outer

>>> b
array([0, 1, 2, 3, 4])
>>> np.einsum('i,j',np.arange(2)+1,b)
array([[0, 1, 2, 3, 4],[0, 2, 4, 6, 8]])
>>> np.outer(np.arange(2)+1,b)
array([[0, 1, 2, 3, 4],[0, 2, 4, 6, 8]])

9,Tensor contraction,数组收缩沿着某一轴相乘

>>> a = np.arange(60).reshape(3,4,5)
>>> b = np.arange(24).reshape(4,3,2)
>>> np.einsum('ijk,jil->kl',a,b)
array([[4400, 4730],[4532, 4874],[4664, 5018],[4796, 5162],[4928, 5306]])
>>> np.tensordot(a,b,axes = [[1,0],[0,1]])
array([[4400, 4730],[4532, 4874],[4664, 5018],[4796, 5162],[4928, 5306]])

:在 numpy 版本 1.12.0 之后,einsum加入了 optimize 参数,用来优化 contraction 操作,对于 contraction 运算部分,操作的数组包含三个或三个以上,optimize 参数设置能提高计算效率,减小内存占比;


Reference:

1,https://zhuanlan.zhihu.com/p/71639781

2,https://numpy.org/doc/stable/reference/generated/numpy.einsum.html

np.einsum(爱因斯坦求和约定)相关推荐

  1. tf.einsum—爱因斯坦求和约定

    1. einsum记法 如果你像我一样,发现记住PyTorch/TensorFlow中那些计算点积.外积.转置.矩阵-向量乘法.矩阵-矩阵乘法的函数名字和签名很费劲,那么einsum记法就是我们的救星 ...

  2. 一文掌握爱因斯坦求和约定 einsum

    爱因斯坦跟 NumPy 有关系吗?没有,但他提出了一个针对数学公式的符号简化办法,即爱因斯坦求和约定(Einstein Summation Convention)或者叫爱因斯坦标记法(Einstein ...

  3. 【深度学习】爱因斯坦求和约定(einsum)

    import tensorflow as tf print(tf.__version__) 2.0.0 一.爱因斯坦求和约定(einsum)的介绍 爱因斯坦求和约定是一种对复杂张量运算的优雅表达方式. ...

  4. 爱因斯坦求和约定 含代码einsum

    目录 一.简介 1.哑标 2.自由标 二.torch实现 1.计算迹 2.取矩阵对角线 3.计算外积 4.batch矩阵乘法 5.带有子列表和省略号 6.变换维度 7.双线性变换,类似于torch.n ...

  5. einsum爱因斯坦求和(numpy)

    0. 爱因斯坦求和约定(Einstein Notation) 在数学中,爱因斯坦求和约定是一种标记法,也称为Einstein Summation Convention,在处理关于坐标的方程式时十分有效 ...

  6. TensorRT - 喜大普奔,TensorRT8.2 EA起开始支持Einsum爱因斯坦求和算子

    1 TensorRT 8.2 EA版本支持爱因斯坦求和算子Einsum NVIDIA在2021年10月6日发布的TensorRT新版本 8.2 Early Access版本终于开始支持爱因斯坦求和算子 ...

  7. MindSpore爱因斯坦求和约定API解析【mindspore.ops.Einsum】

    官方文档写了个寂寞,既非中文也只有示例没有解释,这谁看得懂?总体而言,这个API功能强大,但是,撰写API文档技术有待提高哈.接下来是本人实际测试该API的结果: 符号和参数: mindspore.o ...

  8. python 笔记:爱因斯坦求和 einsum

    1 einsum简介 使用爱因斯坦求和约定,可以以简单的方式表示许多常见的多维线性代数数组运算. 给定两个矩阵A和B,我们想对它们做一些操作,比如 multiply.sum或者transpose等.虽 ...

  9. 爱因斯坦求和约定在Python扩展库Numpy中的实现

    推荐教材: <Python数据分析.挖掘与可视化>(慕课版)(ISBN:978-7-115-52361-7),董付国,人民邮电出版社,定价49.8元,2020年1月出版,2021年12月第 ...

最新文章

  1. Android 阻隔返回键
  2. JavaEE笔记(五)
  3. NASA PHM数据集相关
  4. 遍历二维数组_Java编程基础阶段笔记 day06 二维数组
  5. 输出以下图案菱形7行_春夏格子图案超流行,三木的一款格子连衣裙,带来田园少女风...
  6. isis软件_小白学单片机:单片机电路仿真利器-Protues仿真软件的使用(1)
  7. python 编译成exe黑屏_python''外星人入侵''打包成exe遇到的问题和解决办法,闪退,黑屏。...
  8. 高效的敏捷测试第十三课 自动化测试、用例测试、接口测试、大数据测试
  9. linux程序员实用教程,Linux教程合集(Linux程序员必备)
  10. WinPcap vs Npcap
  11. rls自适应滤波器matlab实现,Matlab自适应滤波器设计Demo——LMS,RLS
  12. 智能工厂ERP解决方案
  13. 计算机类的本科学校有哪些专业考研,计算机专业考研学校推荐有哪些
  14. 被誉为现代电子计算机之父是,成教云: 人们习惯上尊称图灵为现代电子计算机之父。...
  15. 只需操作这三步,轻松找回电脑上被删除的文件
  16. 关于 QMessageBox定制大小重写showEvent失败的 解决方法
  17. win10修改系统字体(替换OneNote中Calibri字体)
  18. 螺旋探索与自适应混合变异的麻雀搜索-附代码
  19. FPGA经验谈系列文章——FPGA资源评估
  20. 异方差下的OLS估计无效性

热门文章

  1. OSChina 周六乱弹 —— 篮球都不想跟你回家了
  2. 计算机软件硬件边界如何定义,软件定义汽车,但别忘了硬件定义了软件的边界...
  3. JDBC_数据库连接池的使用
  4. XSS靶场level15详细通关教程
  5. 使用git下载项目到本地,指定本地文件夹位置的三种方式
  6. 概率矩阵分解(Probabilistic Matrix Factorization)
  7. Winform的消息提示框帮助类
  8. 智慧城市应急指挥中心数字化及城市数字化驾驶舱建设方案
  9. Python复健练习:爬取58同城房产月租及户型加密字体
  10. 全球有多少C++、Java、PHP、Python程序员?