numpy 省略在np.einsum中的一般用法

fnx2tebb  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(110)

我正在尝试使用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)

我希望你能明白我的目的

uttx8gqw

uttx8gqw1#

让我们采取一些小步骤来向您的示例中添加省略号。

In [3]: X = np.array([[1,2],[3,4]])
   ...: Y = np.ones(2**3).reshape((2,2,2))
   ...: Aijk = np.einsum('zi,zjk', X, Y)

In [4]: Aijk
Out[4]: 
array([[[4., 4.],
        [4., 4.]],

       [[6., 6.],
        [6., 6.]]])

明确RHS:

In [5]: np.einsum('zi,zjk->ijk', X, Y)
Out[5]: 
array([[[4., 4.],
        [4., 4.]],

       [[6., 6.],
        [6., 6.]]])

将重复的jk替换为省略号:

In [6]: np.einsum('zi,z...->i...', X, Y)
Out[6]: 
array([[[4., 4.],
        [4., 4.]],

       [[6., 6.],
        [6., 6.]]])

并尝试与其他Y形状(始终保持第一个维度,2匹配z

In [7]: np.einsum('zi,z...->i...', X, np.ones((2,2,2,2)))
Out[7]: 
array([[[[4., 4.],
         [4., 4.]],

        [[4., 4.],
         [4., 4.]]],

       [[[6., 6.],
         [6., 6.]],

        [[6., 6.],
         [6., 6.]]]])

In [12]: np.einsum('zi,z...->i...', X, np.ones((2,3)))
Out[12]: 
array([[4., 4., 4.],
       [6., 6., 6.]])

In [13]: np.einsum('zi,z...->i...', X, np.ones((2,1,2,3)))
Out[13]: 
array([[[[4., 4., 4.],
         [4., 4., 4.]]],

       [[[6., 6., 6.],
         [6., 6., 6.]]]])

我想我可以用'zi,z... ->... i','zi,jz... ->ij...','zi,jz... ->i... j'.(但我没有测试过)。但我很确定我不能用“...我..."一般来说,不能使用ellispis来指定求和'z'维的相对位置。

相关问题