首页 > 编程知识 正文

python计算斐波那契数列,python赵璐版本课后答案

时间:2023-05-05 14:35:39 阅读:60751 作者:1905

1 einsum介绍

爱因斯坦的求和约定可以方便地表示许多常见的多维线性代数数组运算。

给定两个矩阵a和b,我们想对它们做一些操作。 例如,多重、求和或传输等。 numpy有直接可用的接口,可以实现这些功能,但使用enisum可以更快、更节省空间。

例如,我们现在有两个矩阵a和b。 我们想计算a和b乐观的月饼积,也就是每个元素的积,按行合计。

importnumpyasnpa=NP.array ([ 0,1,2 ] ) b=NP.array ) [ 0,1,2,3 ],[ 4,5,6,7 ],[ 8,9,10,11 ]。

a.reshape (-1,1 )、array([0]、[1]、[2] )、)、a.reshape (-1,1 )、b )、array ([ 0,0,0 ]、0

NP.Einsum(I,ij-i ),a,b ) # array ([ 0,22,76 ] ) 2使用Einsum原理einsum的密钥正确标记输入数组和输出数组的axes )轴)

axes可以包含字符串(一般表示形式,如ijk )或整数列表)、1 )等表示形式。

例如,为了实现矩阵乘法,可以使用einsum这样写。 (关于为什么这是矩阵乘法,稍后说明。 )

NP.Einsum(ij,jk-ik ),a,b )字符串) ij,jk-ik )可以由“-”位置分隔,左侧部分) )标记输入的axes

输入标志还由“,”位置分隔,“ij”标记第一个输入a的axes,“jk”标记第二个输入b的axes。

“ij”和“jk”的字符长度都是2,与a和b是2D阵列相对应,“ik”的长度也是2,因此输出也是2D阵列。

给定的输入

a=NP.array ([ 1,3,5 ]、[ 7,9,-7]、[-5,-3,-1] ) b=NP.array ) [ 0,2,4 ]、[ 6,8,6 ]

在输入数组的标记之间,重复的字符表示将沿这些轴的值相乘,它们的乘积构成输出数组的值。 例如在图中沿着j轴做积。 输出标记中省略的字符表示沿该轴的值将被求和。 例如,由于图的输出中不包含j轴,所以沿着j轴进行相加,得到了输出排列的各个项目。 3358 www.Sina.com/a=NP.array ([ 1,3,5 ]、[ 7,9,-7]、[-5,-3,-1] ) b=NP.array ) [0,b ] ' ' -28] 0() ),http://www.Sina.com/a=NP.array ([ 1,3,5 ],[ 7,9,-7],[-5,-3,-1] ) b=NP

6], [4, 2, 0]])np.einsum('ij,jk->ik', A, B)'''array([[ 38, 36, 22], [ 26, 72, 82], [-22, -36, -38]])'''

如果输出的标记是空,那么输出整个矩阵的和 A = np.array([[1, 3, 5], [7, 9, -7], [-5, -3, -1]])B = np.array([[0, 2,4], [6, 8, 6], [4, 2, 0]])np.einsum('ij,jk->', A, B)#180  我们可以按任意顺序排序不求和的轴。 A = np.array([[1, 3, 5], [7, 9, -7], [-5, -3, -1]])B = np.array([[0, 2,4], [6, 8, 6], [4, 2, 0]])np.einsum('ij,jk->kji', A, B)'''array([[[ 0, 0, 0], [ 18, 54, -18], [ 20, -28, -4]], [[ 2, 14, -10], [ 24, 72, -24], [ 10, -14, -2]], [[ 4, 28, -20], [ 18, 54, -18], [ 0, 0, 0]]])''' 3 einsum分析 3.1 'ij,jk->ijk'  与 'ij,jk->kji'

 我们一个一个分析一下

A = np.array([[1, 3, 5], [7, 9, -7], [-5, -3, -1]])B = np.array([[0, 2,4], [6, 8, 6], [4, 2, 0]])np.einsum('ij,jk->ijk', A, B)'''array([[[ 0, 2, 4], [ 18, 24, 18], [ 20, 10, 0]], [[ 0, 14, 28], [ 54, 72, 54], [-28, -14, 0]], [[ 0, -10, -20], [-18, -24, -18], [ -4, -2, 0]]])'''

首先,这几个数字是怎么得到的?

0=1*02=1*24=1*418=3*624=3*818=3*620=5*410=5*20=5*00=7*014=7*228=7*454=9*672=9*854=9*6-28=-7*4-14=-7*20=-7*00=-5*0-10=-5*2-20=-5*4-18=-3*6-24=-3*8-18=-3*6-4=-1*4-2=-1*20=-1*0

转换成坐标,有:

[0,0]*[0,0][0,0]*[0,1][0,0]*[0,2][0,1]*[1,0][0,1]*[1,1][0,1]*[1,2][0,2]*[2,0][0,2]*[2,1][0,2]*[2,2][1,0]*[0,0]

[1,0]*[0,2]

[1,0]*[0,4][1,1]*[1,0][1,1]*[1,1][1,1]*[1,2][1,2]*[2,0][1,2]*[2,1][1,2]*[2,2][2,0]*[0,0][2,0]*[0,1][2,0]*[0,2][2,1]*[1,0][2,1]*[1,1][2,1]*[1,2][2,2]*[2,0][2,2]*[2,1][2,2]*[2,2]A = np.array([[1, 3, 5], [7, 9, -7], [-5, -3, -1]])B = np.array([[0, 2,4], [6, 8, 6], [4, 2, 0]])np.einsum('ij,jk->kji', A, B)'''array([[[ 0, 0, 0], [ 18, 54, -18], [ 20, -28, -4]], [[ 2, 14, -10], [ 24, 72, -24], [ 10, -14, -2]], [[ 4, 28, -20], [ 18, 54, -18], [ 0, 0, 0]]])'''

 与上面类似,我们就看第一个3*3的矩阵吧

0=1*00=7*00=-5*018=3*654=9*6-18=-3*620=5*4-28=-7*4-4=-1*4[0,0]*[0,0][1,0]*[0,0][2,0]*[0,0][0,1]*[1,0][1,1]*[1,0][2,1]*[1,0][0.2]*[2,0][1,2]*[2,0][2,2]*[2,0]

可以这么考虑 对于 结果矩阵(比如ijk),第【i,j,k】元素的结果等于【i,j】乘以【j,k】

3.2 'ij,jk->ik'   A = np.array([[1, 3, 5], [7, 9, -7], [-5, -3, -1]])B = np.array([[0, 2,4], [6, 8, 6], [4, 2, 0]])np.einsum('ij,jk->ik', A, B)'''array([[ 38, 36, 22], [ 26, 72, 82], [-22, -36, -38]])'''

我们前面 'ij,jk->ijk'的结果是 

0=1*02=1*24=1*418=3*624=3*818=3*620=5*410=5*20=5*00=7*014=7*228=7*454=9*672=9*854=9*6-28=-7*4-14=-7*20=-7*00=-5*0-10=-5*2-20=-5*4-18=-3*6-24=-3*8-18=-3*6-4=-1*4-2=-1*20=-1*0

这边相当于

        

38=0+18+2036=2+24+1022=4+1826=54-2872=14+72-1482=54+28-22=-18-4-36=-10-24-2-38=-20-18

可以这么考虑 对于 结果矩阵(比如ik),第【i,k】元素的结果等于:对所有的j,【i,j】乘以【j,k】的结果的和

4 常用的Einsum 4.1 向量篇 ('i',A)

向量A的一个视图

可以看成'i->i',即结果的第i位,是A的第i位

('i->', A)

sum(A)

可以看成'i->0',即结果的第0位,是A的第i位的和

('i,i->i', A,B)

向量A,B对应位置相乘

'i,i->i':结果的第i位,是A和B的第i位的积 

('i,i->', A,B)

向量A,B的内积

 'i,i->':可以看成'i,i->0' 结果的第0位,是A和B的第i位的积 再求和 

('i,j->ij', A,B)

向量A,B的外积

 'i,j->ij':结果的第i行第j列,是A的第i个元素和B的第j个元素的乘积

 4.2 矩阵篇 ('ij', A)

返回矩阵A

看成'ij->ij' ,结果的第i行第j列,是A的第i行第j列

('ji->ij', A)

返回矩阵A的转置

结果的第i行第j列的元素是A的第j行第i列的元素 

('ii->i', A)

矩阵A的对角线元素

结果的第i个元素是A的第i行第i列的元素 

('ij->', A)

矩阵A的元素之和

可以看成'ij->0' 结果的第0位是A的第i行第j列的元素,再求和 

('ij->j', A)

A纵向求和

结果的第j个元素是,对所有的i,A的第(i,j)个元素的和 

('ij->i', A)

A横向求和

结果的第i个元素是,对所有的j,A的第(i,j)个元素的和 

('ij,ij->ij', A,B)

矩阵A,B相应位置的乘积

结果第i,j个元素,是A的第(i,j)个元素和B的第(i,j)个元素的乘积 

('ij,ji->ij', A,B)

矩阵A和  矩阵B的转置   相应位置的乘积

结果第i,j个元素,是A的第(i,j)个元素和B的第(j,i)个元素的乘积 

('ij,jk->ik', A,B)

A,B的矩阵乘积

结果的第(i,k)个元素等于A的第(i,j)个元素乘以B的第(j,k)个元素 

('ij,kj->ik', A,B)

矩阵A和矩阵B的内积

('ij,kl->jikl', A,B)

A的每个元素乘以矩阵B

结果的 第(j,i,k,l)个元素是A的(i,j)和B的(k,l)的乘积 

('dn,nd->',A,B)

相当于tr(AB)

 

 5 显示表明和隐式表明

我们将指定'->'和输出标记称为 explicit mode。

如果不指定'->'和输出标记,numpy会将输入标记中只出现一次的标记按照字母表顺序,作为输出标记(也就是 implicit mode)。

'ij,jk->ik' 等价于 'ij,jk'

参考文章:einsum初探 - 知乎 (zhihu.com)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。