首页
学习
活动
专区
圈层
工具
发布

一文读懂Python实现张量运算

张量运算的Einstein notation,与numpy实现 在量子化学编程的语义下,我们不必过多的讨论张量是什么的问题,张量就是一个多维数组。...接下来我们要对A、B进行运算得到C,C矩阵元定义如下: ? ‍‍Einstein notation约定,对于上述求和公式,我们可以省略掉 ∑,即 ?...常见的例子 矩阵的迹 我们有方阵 A,现在想求它的迹tr(A)。 ? 注意,此时求和结果是个数字(零维张量)没有下标,我们要把箭头右侧留空。...D 此时np.einsum('ik ,kj → ij',A,B) 与np.dot(A,B)等价。 其他的例子,如叉积、Hadamard积、张量转置然后乘积等等都能用einsum方便计算。 3....量子化学中的举例 在构造Fock算符中,我们会遇到如下运算, ? 上式是Coulomb对Fock的贡献,它几乎无法转化为矩阵乘法运算,我们只好写循环嵌套,Fock算符的构造比较耗时。

4.2K40

高效处理多维数组:einsum()函数从入门到精通

在NumPy中(后文将讨论其他框架如PyTorch、TensorFlow等),np.einsum()函数允许直接应用这种表示法进行数组操作。...在NumPy实现中,可以使用任何小写或大写字母作为索引,且在显式语法中,字母的顺序并不影响计算结果。 einsum()执行的具体操作取决于索引在字符串中的出现位置和方式。...求和专指对特定索引进行规约操作,例如对索引j求和。而收缩是一个更广泛的概念,它包含求和操作,但同时也表示张量维度的减少。例如,矩阵乘法可视为在一个维度上的收缩。...在einsum字符串"bi,bk->bik"中,所有输入索引都保留在输出中,表明没有执行求和。这里的b索引出现在所有张量中,表示在批处理维度上执行外积运算。...NumPy、PyTorch、TensorFlow等科学计算库通常使用这些库加速矩阵运算。 einsum()在某些情况下可利用BLAS子程序优化计算,特别是矩阵乘法等标准线性代数运算。

27610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    einsum,一个函数走天下

    在实现一些算法时,数学表达式已经求出来了,需要将之转换为代码实现,简单的一些还好,有时碰到例如矩阵转置、矩阵乘法、求迹、张量乘法、数组求和等等,若是以分别以 transopse、sum、trace、tensordot...:diag 张量(沿轴)求和:sum 张量转置:transopose 矩阵乘法:dot 张量乘法:tensordot 向量内积:inner 外积:outer 该函数在 numpy、tensorflow、...对应的 einsum 实现: 下面以 numpy 做一下测试,对比 einsum 与各种函数的速度,这里使用 python 内建的 timeit 模块进行时间测试,先测试(四维)两张量相乘然后求所有元素之和...不过在 numpy 的实现里,einsum 是可以进行优化的,去掉不必要的中间结果,减少不必要的转置、变形等等,可以提升很大的性能,将 einsum 的实现改一下: 加了一个参数 optimize=True...einsum 的速度与 dot 达到了一个量级;不过 numpy 官方手册上有个 einsum_path,说是可以进一步提升速度,但是我在自己电脑上(i7-9750H)测试效果并不稳定,这里简单的介绍一下该函数的用法为

    2.2K20

    一文学会 Pytorch 中的 einsum

    einsum 可以很方便的实现复杂的张量操作,而且不容易出错。...equation 中的字符也可以理解为索引,就是输出张量的某个位置的值,是怎么从输入张量中得到的,比如上面矩阵乘法的输出 c 的某个点 c[i, j] 的值是通过 a[i, k] 和 b[i, k]...特殊规则 特殊规则有两条: equation 可以不写包括箭头在内的右边部分,那么在这种情况下,输出张量的维度会根据默认规则推导。...= perm_index; // 对齐输出张量的维度,使得对齐之后的维度等于 // 自由索引加上求和索引的个数 // 对输出补全省略掉的求和索引 // 也就是在输入等式中出现,但是没有在输出等式中出现的字符...Pytorch 源码 // 这里我还没有完全理解 sumproduct_pair 的实现, // 里面用的是 permute + bmm, // 不过我觉得可以简单理解为

    2.9K30

    高效处理多维数组:einsum()函数从入门到精通

    在NumPy中(后文将讨论其他框架如PyTorch、TensorFlow等),np.einsum()AI写代码1函数允许直接应用这种表示法进行数组操作。...在NumPy实现中,可以使用任何小写或大写字母作为索引,且在显式语法中,字母的顺序并不影响计算结果。einsum()AI写代码1执行的具体操作取决于索引在字符串中的出现位置和方式。...求和专指对特定索引进行规约操作,例如对索引j求和。而收缩是一个更广泛的概念,它包含求和操作,但同时也表示张量维度的减少。例如,矩阵乘法可视为在一个维度上的收缩。...在einsum字符串"bi,bk->bik"AI写代码1中,所有输入索引都保留在输出中,表明没有执行求和。这里的b索引出现在所有张量中,表示在批处理维度上执行外积运算。...NumPy、PyTorch、TensorFlow等科学计算库通常使用这些库加速矩阵运算。einsum()AI写代码1在某些情况下可利用BLAS子程序优化计算,特别是矩阵乘法等标准线性代数运算。

    43120

    基于numpy.einsum的张量网络计算

    在使用张量的形式来表示单个矩阵的同时,我们需要考虑如果有多个矩阵的乘法运算,我们该如何表示?...times2} ,由于这里的多维张量运算已经不能使用普通的numpy.dot来处理,因此我们还是适用了专业的张量计算函数numpy.einsum来进行处理,计算结果如下: A: [[[[0.85939221...其中重点说明了,在特定的缩并顺序下,可以极大程度上的优化张量缩并的性能。这里我们讨论一种在量子计算中常用的技巧:张量的分割。...然后再次使用numpy.einsum来进行验证。...假如是我们常见的 d=2 的张量网络,那么在进行张量分割之后,类似于上面这个案例的,张量缩并的时间可以加速1倍甚至更多。

    1.9K60

    能「看到」的张量运算:​因子图可视化

    在矩阵乘法的定义中, ? 求和符号实际上是多余的。我们可以直接舍弃它,并推断出索引 k 必须被求和,因为它没有出现在左侧。 ? 为什么要这么做?...另外,你可以使用 numpy.einsum 在 Python 中轻松尝试这些。...因为这能让我们将复杂的因子分解转换成更可视化的表示,从而更加轻松地处理。numpy 中的数值张量运算可以很好地适用于这个框架。下面给出了几个无需过多解释的示例: 矩阵-向量乘法 ?...矩阵-矩阵乘法 ? 逐元素求积 ? 外积 ? 轨迹 ? 注意,没有边的因子是 0 维张量,其实就是单个数值(轨迹就该是这样)。...可视化证明 使用简洁的可视化证明,我们不仅可以理解 numpy 运算,还能迅速搞定数学定理。下面就简洁地证明了我一开始提到的轨迹恒等: 轨迹是循环的 ?

    1.4K40

    einsum is all you needed

    einsum 提供了一套既简洁又优雅的规则,可实现包括但不限于:内积,外积,矩阵乘法,转置和张量收缩(tensor contraction)等张量操作,熟练掌握 einsum 可以很方便的实现复杂的张量操作...尤其是在一些包括batch维度的高阶张量的相关计算中,若使用普通的矩阵乘法、求和、转置等算子来实现很容易出现维度匹配等问题,但换成einsum则会特别简单。...一,einsum规则原理 顾名思义,einsum这个函数的思想起源于家喻户晓的小爱同学:爱因斯坦~。 很久很久以前,小爱同学在捣鼓广义相对论。广义相对论表述各种物理量用的都是张量。...公式展现形式中除了省去了求和符号,还省去了乘法符号(代数通识)。 借鉴爱因斯坦求和约定表达张量运算的清爽整洁,numpy、tensorflow和 torch等库中都引入了 einsum这个函数。...上述矩阵乘法可以被einsum这个函数表述成 C = torch.einsum("ik,kj->ij",A,B) 这个函数的规则原理非常简洁,3句话说明白。 1,用元素计算公式来表达张量运算。

    2.1K40

    可以用爱因斯坦求和替代的那些矩阵运算

    案例演示 在numpy、Jax框架和MindSpore框架中都是支持爱因斯坦求和算符的,那么这里为了方便演示,我们采用的是numpy来做一些参考案例: In [1]: import numpy as np...(P.T, np.einsum('ji', P)) Out[41]: True 元素乘 对应于两个矩阵(矢量、张量)之间的元素乘法,普通操作我们可以直接用 x*y 来实现(假定维度大小为3): x*y...(P, P.T), np.einsum('kl,lm->km', P, P.T)) Out[31]: True 在上述案例中我们还包含了矩阵跟矩阵之间的乘法,这些基本运算都是可以通用的。...克罗内克积 克罗内克积,又叫张量积,比如两个矢量或者矩阵之间没有耦合关系,那么可以用一个克罗内克积来总体表示这两个矢量或者矩阵组成的矢量或者矩阵,该运算被定义为: x\otimes y^{T}=\left...(P), np.einsum('ii->', P)) Out[47]: True 多重运算 有时候会涉及到一系列的矩阵按照顺序作用在一个向量上,如果从张量的角度来考虑的话,其中的维度还可以非常灵活的变化

    1.5K30

    哈希算法、爱因斯坦求和约定,这是2020年的注意力机制

    当然,在广泛应用之余,人们也在思考 Transformer 存在的缺陷,并进行弥补。...你可能会说,我不一次性计算 Query 中的所有序列,而每次只算一步,例如一个中文词,计算它与所有英文词之间的相似性。这样不就没问题了么?这是没问题的,但并没有实质上的改变。...同时作者在张量的计算中使用了 einsum 表示法,也就是爱因斯坦求和约定。它在 numpy、tensorflow、pytorch 等 Python 扩展库中均有实现。...使用 einsum 表示法能够仅使用一个函数,就可以优雅地实现如点积、外积、转置、矩阵-向量乘法、矩阵-矩阵乘法等运算。...我们可以从以下伪代码看出,GBMA 具有两个三维的参数张量。 ? 从以下伪代码不难看出,多头注意力机制在数学上等效于,使用两个因子的乘积分别表示 GBMA 中的各参数张量。 ?

    87520

    深度学习框架中的「张量」不好用?也许我们需要重新定义Tensor了

    尽管张量在深度学习的世界中无处不在,但它是有破绽的。它催生出了一些坏习惯,比如公开专用维度、基于绝对位置进行广播,以及在文档中保存类型信息。...张量类是多维数组对象,是 Torch、TensorFlow、Chainer 以及 NumPy 等深度学习框架的核心对象。张量具备大量存储空间,还可以向用户公开维度信息。...如果在代码中隐藏了这个维度,可能会产生一些本来很容易避免的、讨厌的 bug。 陷阱 2:通过对齐进行广播 张量最有用的地方是它们可以在不直接需要 for 循环的情况下快速执行数组运算。...在命名向量间进行张量缩并的更普遍的特征是 dot 方法。张量缩并是 einsum 背后的机制,是一种思考点积、矩阵-向量乘积、矩阵-矩阵乘积等泛化的优雅方式。...这个例子是我的同事 Tim Rocktashel 在一篇介绍 einsum 的博客文章中提出来的。和原始的 PyTorch 相比,Tim 的代码是更好的替代品。

    1.9K20

    3 | PyTorch张量操作:基本操作、索引、命名

    在PyTorch中都是使用张量的概念和数据结构来进行运算的。 搞过机器学习的朋友可以知道,并不是只有PyTorch是处理多维数组的唯一库,像常用的科学计算库NumPy,都是以处理多维数组为基础的。...而PyTorch可以与NumPy无缝衔接,这使得它可以很方便的与scikit-learn等库进行集成。...可以看到跟列表基本上没有区别,但是前面有tensor限定,表明这是一个张量元素。当然了,我理解限定张量元素主要是它还有很多各种各样的操作,要比列表丰富的多,后面应该可以学到。...但是在特殊情况下是否支持非连续内存块的存储呢?现在这书上没有写,后面慢慢观察。 这里还有一个代码示例。我们期望用一个tensor去存储一个三角形的三个点的坐标。...)提供了一套既简洁又优雅的规则,可实现包括但不限于:向量内积,向量外积,矩阵乘法,转置和张量收缩(tensor contraction)等张量操作,熟练运用 einsum 可以很方便的实现复杂的张量操作

    96710

    盘一盘 Python 特别篇 23 - 爱因斯坦求和 einsum

    在 NumPy 包中,有一个函数叫做 einsum,它做的事情就是加总 (summation),但是是以爱因斯坦加总惯例 (Einstein's summation convention) 进行,因此得以此名...从标量可以猜想出以上规则,但标量没有轴的概念,而且求和与其本身也看不来区别,因此我们需要用向量、矩阵和张量来验证或完善上面的规则。 2.2 向量 1 维单数组 首先创建向量 arr1。...而如上描述的操作刚好也是矩阵相乘的定义。 现在问题来了,那么在没有沿着 j 代表的轴求和之前的产出是什么呢?...简约 在注意力机制实现方式中,当考虑 Batch 维度时,公式如下: 用 einsum 函数可以非常简约的实现上面表达式: from numpy.random import normal Q =...: diag 张量(沿轴)求和: sum 张量转置: transopose 矩阵乘法: dot 张量乘法: tensordot 向量内积: inner 外积: outer 另外两表胜千言!

    2.3K20

    从模型源码梳理TensorFlow的乘法相关概念

    1.5 重载 TensorFlow会进行操作符重载,具体是: 元素乘法:tf.multiply(),可以用*运算符代替, 向量乘法:tf.matmul(),可以用@运算符代替。...a和b除了最后两个维度可以不一致,其他维度要相同; a和b最后两维的维度要符合矩阵乘法的要求(比如a的(3,4)能和b的(4,6)进行矩阵乘法); 比如 a的维度是(2,2,3); b的维度是(2,3,...正常情况下,当你想要进行一些操作如加法,乘法时,你需要确保操作数的形状是相匹配的,如:你不能将一个具有形状[3, 2]的张量和一个具有[3,4]形状的张量相加。...所以,对一个[3,2]的张量和一个[3,1]的张量相加在TF中是合法的。(这个机制继承自numpy的广播功能。...广播会在缺失维度和(或)轴长度为1的维度上进行。 广播机制允许我们在隐式情况下进行填充(tile),而这可以使得我们的代码更加简洁,并且更有效率地利用内存,因为我们不需要另外储存填充操作的结果。

    2K20

    张量与张量网络背景和意义-基础知识

    让我们用几个常用的图来看看张量网络大概长什么样子(下图转载自参考链接1): 上面这个图从左到右分别表示:一阶张量、二阶张量以及三阶张量,我们可以看出,一个张量的阶数在图像化的表示中被抽象称为了张量的腿的数量...在使用张量的形式来表示单个矩阵的同时,我们需要考虑如果有多个矩阵的乘法运算,我们该如何表示?...,这里使用随机的张量来进行计算,这里的M表示二阶张量,v,w表示一阶张量。...0.88983912] 同时我们也考虑下另外一种张量运算的场景,一个高阶的张量与另外一个高阶的张量进行运算: 1 2 3 4 5 6 7 import numpy as np A = np.random.rand...numpy.dot来处理,因此我们还是适用了专业的张量计算函数numpy.einsum来进行处理,计算结果如下: 1 2 3 4 5 6 7 8 9 10 11 12 A: [[[[0.85939221

    1.9K10

    深度学习:张量 介绍

    3D 张量可以被视为三维矩阵列表: 考虑 3D 张量的另一种方式是使用矩阵作为元素的向量。请注意,在本文中它们是用书法大写字母标注的。...4D 张量可以被认为是 3D 张量的四维列表: 考虑 4D 张量的另一种方式是使用 3D 张量作为其元素的向量。这些可能会变得越来越复杂,但这是继续使用张量进行运算所必需的程度。...点积的输出是一个标量。它不返回向量。 Hadamard(乘法) Hadamard 乘积用于执行逐元素乘法并返回一个向量。...x = torch.tensor([1, 3, 5]) y = torch.tensor([3, 7, 4]) x * y # tensor([ 3, 21, 20]) 标量乘法 k 是标量,在大多数情况下是实数...它还需要第一轴和第二轴与两个张量匹配: (c、z、m、n) x (c、z、n、r) = (c、z、m、r) 在三维空间中,进行矩阵乘法,然后进行向量之间的点积。

    99820

    图神经网络版本的Kolmogorov Arnold(KAN)代码实现和效果对比

    在forward方法中,输入张量x被重塑为二维张量。创建频率k的网格,重塑的输入xrshp用于计算余弦和正弦变换,以找到输入数据中的模式,从而产生两个张量c和s,表示输入的傅里叶特征。...然后将这些张量连接并重塑以匹配后面计算需要的维度。 einsum函数用于在连接的傅立叶特征和傅立叶系数之间执行广义矩阵乘法,产生转换后的输出y。...einsum函数中使用的字符串“dbik,djik->bj”是一个指示如何运行矩阵乘法的einsum字符串(在本例中为一般矩阵乘法)。...fouriercoeffs参数是一个可学习的傅立叶系数张量,初始化为正态分布,并根据输入维度和网格大小进行缩放。...,准确率有所提升,但是我们这里并没有做任何的优化,只是拿来直接使用了,所以这并不能证明KAN在实际应用中要强过GCN或者GAT,但是这个对比可以证明KAN是可以改进图神经网络的,所以如果你在进行图神经网络方面的研究

    91310

    NumPy中einsum的基本介绍

    是什么einsum呢 使用einsum函数,我们可以使用爱因斯坦求和约定(Einstein summation convention)在NumPy数组上指定操作。 假设我们有两个数组,A和B。...简而言之,因为我们根本不需要对A进行reshape,最重要的是,乘法不会创建像A[:, np.newaxis] * B这样的临时数组。相反,einsum只需沿着行对乘积进行求和。...对于两个二维数组A和B,矩阵乘法操作可以用np.einsum(‘ij,jk->ik’, A, B)完成。 这个字符串是什么意思?想象’ij,jk->ik’在箭头->处分成两部分。...下面是两个表格展示了einsum如何进行各种NumPy操作。我们可以用它来熟悉符号。 让A和B是两个形状兼容的一维数组(也就是说,我们相应的轴的长度要么相等,要么其中一个长度为1): ?...最后,einsum并不总是NumPy中最快的选择。如函数dot和inner经常链接到BLAS例程可以超越einsum在速度方面,tensordot函数也可以与之相比。

    12.7K30

    《deep learning》学习笔记(2)——线性代数

    在numpy中,可以用以下方式生成各种维度的张量: >>> import numpy as np ## 生成元素全为0的二维张量,两个维度分别为3,4 >>> np.zeros((3,4)) array...,包括元素对应乘积、相加等,即对两个张量相同位置的元素进行加减乘除等运算。...如果一组向量中的任意一个向量都不能表示成其他向量的线性组合,那么这组向量被称为线性无关。 2.5 范数 在机器学习中,我们经常使用被称为范数(norm)的函数衡量向量大小: ?...有时候我们可能也希望衡量矩阵的大小。在深度学习中,最常见的做法是使 用Frobenius 范数(Frobenius norm): ?...2.11 行列式 行列式,记作 det(A),是一个将方阵 A 映射到实数的函数。行列式等于矩阵特征值的乘积。行列式的绝对值可以用来衡量矩阵参与矩阵乘法后空间扩大或者缩小了多少。

    58550
    领券