在Python中使用NumPy的张量收缩与爱因斯坦求和惯例
在这篇文章中,让我们在Python中找到具有爱因斯坦求和惯例的张量收缩。
numpy.einsum() 方法
爱因斯坦求和法是一种简化公式的符号约定,如向量、矩阵和一般张量求和。NumPy库中的numpy.einsum()方法被用来在Python中用爱因斯坦求和约定来寻找张量收缩。许多常见的多维、线性代数数组操作可以用爱因斯坦求和方法来简单描述,它以隐式模式计算这些值。通过抑制或强制在显式模式下对定义的下标标签进行求和,它允许我们有额外的自由来计算可能不被认为是标准的爱因斯坦求和操作的替代数组操作。
语法: numpy.einsum(subscripts, *operands, out=None)
参数:
- subscripts: str type.作为一个逗号分隔的下标标签列表,指定用于求和的下标。除非给出明确的符号’->’和精确输出形式的下标标签,否则将进行隐式(经典的爱因斯坦求和)计算。
- operands:array_like的列表。该操作的数组如下。
- out: ndarray, 可选参数。如果提供了这个数组,计算将在这个数组中完成。
返回:基于爱因斯坦求和惯例的计算是输出。
示例:
这里,我们将使用np.range()方法创建两个NumPy数组。之后使用numpy.einsum()方法,用Python中的爱因斯坦求和惯例找到张量收缩。字符串’ijk, jil – >kl’将被传递到代表张量收缩的np.einsum()方法的subscripts参数中,它将在两个数组上进行,并返回结果。
# import packages
import numpy as np
# np.arange() method is used to create
# two arrays
arr1 = np.arange(12).reshape(2,2,3)
arr2 = np.arange(12).reshape(2,2,3)
# Display the arrays
print("Array of letters is :",arr1)
print("Array of numbers is :",arr2)
# Checking the dimensions
print("Array one dimension :",arr1.ndim)
print("Array two dimension",arr2.ndim)
# Checking the shape of the arrays
print("Shape of array 1 is : ",arr1.shape)
print("Shape of array 2 is : ",arr2.shape)
# Tensor contraction with Einstein summation convention
print("Tensor contraction : ",np.einsum('ijk,jil->kl', arr1, arr2))
输出:
Array of letters is : [[[ 0 1 2]
[ 3 4 5]]
[[ 6 7 8]
[ 9 10 11]]]
Array of numbers is : [[[ 0 1 2]
[ 3 4 5]]
[[ 6 7 8]
[ 9 10 11]]]
Array one dimension : 3
Array two dimension 3
Shape of array 1 is : (2, 2, 3)
Shape of array 2 is : (2, 2, 3)
Tensor contraction : [[117 135 153]
[135 157 179]
[153 179 205]]