Numpy einsum() – 爱因斯坦求和

爱因斯坦求和用于简化张量、矩阵和向量表达式。这是一种符号约定。在 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
计算爱因斯坦求和的输出和代码。

建议:在 Python 中展平嵌套列表

使用 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]]
Einsum() 以及 Arange() 和 Reshape() 函数

请查看:如何在 Numpy 数组中查找最近值?

概括

在本教程中,我们了解了如何使用 numpy.einsum() 函数来计算两个类似数组的矩阵的爱因斯坦和。我们已经了解了 einsum() 函数的语法,并了解了如何将其用于各种计算,例如确定转置、矩阵的点积。

通过这里提到的两个例子,我们尝试在一维和二维数组上实现该函数。要了解有关 einsum() 函数的更多信息,请访问官方文档