爱因斯坦求和用于简化张量、矩阵和向量表达式。这是一种符号约定。在 python 中,numpy 提供了一个名为 einsum() 的函数,它可以根据指定隐式或显式计算爱因斯坦求和。
Numpy 在隐式模式下,einsum() 函数以简单的方式减少多维数组。当显式使用时,我们可以指定参数以非刻板的方式对所需的数组进行求和,这不是默认的爱因斯坦求和。
这可以通过指定 einsum() 函数的下标参数来完成。我们将在以下部分中查看该函数的语法。
爱因斯坦求和的 3 个主要属性
为了简洁起见,在高等数学和物理学中使用了爱因斯坦求和的三个主要属性。他们是:
- 对重复的指数进行求和。
- 每个索引的出现次数限制为两次。
- 爱因斯坦求和的每一项最多可以有两个相同的索引。
numpy.einsum() 函数的语法
einsum() 函数的编写方式如下:
numpy.einsum(下标,*操作数,输出,dtype,顺序,转换,优化)
该函数的参数为:
subscripts: string type
-> 当使用“->”符号明确提及时,指定逗号分隔下标的列表。否则,将隐式计算经典爱因斯坦求和。*operands: ndarray ->
所操作的数组。out: ndarray-> (optional)
如果指定,爱因斯坦求和将存储在此数组中。dtype: data type-> (optional)
如果指定,则强制计算将自身限制为指定的数据类型。该参数的默认值为 None。order:{'C','F','A','K'}-> (optional)
确定输出的内存结构。C= 连续,F= Fortran 连续,K= 与输入相同的布局,如果输入全部为“F”和“C”,则 A=“F”。casting{‘no’, ‘safe’, ‘unsafe’,‘equiv’,‘same_kind’}->optional
确定数据可能发生的转换类型。“no”表示不应该进行转换,“safe”表示应保留允许的值,“unsafe”(不推荐)表示允许所有类型的转换,“equiv”仅允许字节大小的更改,“same_kind”表示只允许某种类型的转换,例如 float64 或 float32。如果未提及,则默认为“安全”。optimize{'optimal','greedy',True,False}->(optional)
如果设置为 False,则不会发生中间资源优化,但设置为 True 时,它将采用默认的“贪婪”值。
该函数的输出是:
输出:ndarray -> 返回爱因斯坦求和。
einsum() 还能做什么?
einsum() 函数可以执行很多操作。让我们看看其中的一些函数:
- einsum(‘ii’,”matrix_name”) 函数可以找到由 numpy.trace(matrix) 函数确定的矩阵的迹。
- numpy.inner(matrix1, matrix2) 的等价物可以使用 einsum(‘i,i’,matrix1,matrix2) 计算,其中 i 是下标。
- 矩阵乘法和点积可以使用 einsum(‘ij,jk’,matrix1,matrix2) 求出。
- 其他函数(例如转置、对角线和排列)也可以使用 einsum() 函数执行。
- einsum_path() 还可以计算链式矩阵运算。
实现 Einsum() 求和函数
在我们首先进入代码之前,我们必须确保我们的系统中有所需的模块。在导入numpy之前,在管理员模式下的命令提示符中运行以下代码。
pip install numpy |
现在,我们以列表的形式从用户那里获取一个一维数组,然后计算爱因斯坦求和。
#importing required modules import numpy as np #determining length of array N,j = int ( input ( "Enter size of arrays= " )), 0 #for two matrices at a time while (j< 2 ): arrayy = [] for i in range (N): #taking user input of individual elements ele = int ( input ( "Enter " + str (i + 1 ) + "th element of the " + str (j + 1 ) + "th array = " )) arrayy.append(ele) if (j = = 0 ): #creating the first matrix arr1 = np.array(arrayy) else : #creating the second matrix arr2 = np.array(arrayy) j + = 1 # Original arrays after taking user input print ( "The first array or matrix is =" ,arr1) print ( "The second array or matrix is =" ,arr2) #calculating the einstein summation result = np.einsum( "n,n" , arr1, arr2) #displaying the einstein summation of the given arrays print ( "The Einstein Summation is =" , result) |
输出将是:
Enter size of arrays= 2 Enter 1th element of the 1th array = 45 Enter 2th element of the 1th array = 50 Enter 1th element of the 2th array = 75 Enter 2th element of the 2th array = 80 The first array or matrix is = [45 50] The second array or matrix is = [75 80] The Einstein Summation is = 7375 |
使用 numpy.arange() 和 einsum()
在下一个示例中,让我们使用arange()和reshape()函数创建一个numpy 数组,然后计算两个数组的爱因斯坦总和。
#importing required modules import numpy as np #creating the numpy arrays arr1 = np.arange( 18 , 36 , 2 ).reshape( 3 , 3 ) arr2 = np.arange( 38 , 56 , 2 ).reshape( 3 , 3 ) #displaying the original arrays print ( "The first array or matrix is =" ,arr1) print ( "The second array or matrix is =" ,arr2) #calculating the einstein summation result = np.einsum( "ij,jk" , arr1, arr2) #displaying the einstein summation of the given arrays print ( "The Einstein Summation is =" , result) |
输出将是:
The first array or matrix is = [[18 20 22] [24 26 28] [30 32 34]] The second array or matrix is = [[38 40 42] [44 46 48] [50 52 54]] The Einstein Summation is = [[2664 2784 2904] [3456 3612 3768] [4248 4440 4632]] |
概括
在本教程中,我们了解了如何使用 numpy.einsum() 函数来计算两个类似数组的矩阵的爱因斯坦和。我们已经了解了 einsum() 函数的语法,并了解了如何将其用于各种计算,例如确定转置、矩阵的点积。
通过这里提到的两个例子,我们尝试在一维和二维数组上实现该函数。要了解有关 einsum() 函数的更多信息,请访问官方文档。