我正在尝试使用np.einsum
实现Tensor网络计算。计算的目标是让一个局部2x2矩阵顺序作用于大小为(2,2,2,.,2,2,2)的Tensor,其中维数可以是任意的(只要内存允许)。我有一个大小为(2,2,2)的Tensor的简单实现
X = np.array([[1,2],[3,4]])
Y = np.ones(2**3).reshape((2,2,2))
Aijk = np.einsum('zi,zjk', X, Y)
Bijk = np.einsum('zi,jzk', X, Aijk)
Cijk = np.einsum('zi,jkz', X, Bijk)
可以看出,对于每个后续计算,要求和的索引应该向右移动。我可以生成适当的显式字符串,但我想知道是否可以使用省略号实现这一点,但我不确定如何指定索引位置,如果索引不是最左边或最右边的索引。
X = np.array([[1,2],[3,4]])
Y = np.ones(2**n).reshape(shape) # where shape is the appropriate n-tuple
A = np.einsum('a...,a...', X, Y)
B = np.einsum('b...,...b...', X, A) # how do I specify that the summed index of A is the second one?
...
N = np.einsum('l...,...l', X, M)
我希望你能明白我的目的
1条答案
按热度按时间uttx8gqw1#
让我们采取一些小步骤来向您的示例中添加省略号。
明确RHS:
将重复的
jk
替换为省略号:并尝试与其他
Y
形状(始终保持第一个维度,2
匹配z
:我想我可以用'zi,z... ->... i','zi,jz... ->ij...','zi,jz... ->i... j'.(但我没有测试过)。但我很确定我不能用“...我..."一般来说,不能使用ellispis来指定求和'z'维的相对位置。