对symarray指数的总结

时间:2017-10-05 20:23:19

标签: python matrix sympy

我试图通过对张量中的索引求和来创建符号表达式。对于矩阵/ 2D张量,这非常简单:

from sympy import *

Q = MatrixSymbol('Q', 2,2)

i,j = symbols('i j')
summation(summation(Q[i,j],(i,0,2)),(j,0,2))

当我试着看一个四阶张量时,我遇到了问题。这是我的尝试:

from sympy import *

Q = MatrixSymbol('Q', 2,2)
C = symarray('C', (2,2,2,2))

i,j,k,l = symbols('i j k l')
summation(summation(summation(summation(Q[i,j]*C[i,j,k,l],(i,0,2)),(j,0,2)),(k,0,2)),(l,0,2))

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

C = sym.symarray('C', (2,2,2,2))使C成为NumPy SymPy符号数组。 由于C本身不是SymPy符号,因此当NumPy遇到符号索引(如C[i,j,k,l])时会发现它。

要解决此问题,请将C设为SymPy NDimArray:

C = sym.tensor.Array(C)
import sympy as sym

Q = sym.MatrixSymbol('Q', 2,2)
C = sym.symarray('C', (2,2,2,2))
i,j,k,l = sym.symbols('i j k l')
C = sym.tensor.Array(C)

print(sym.summation(Q[i,j]*C[i,j,k,l], (i,0,1), (j,0,1), (k,0,1), (l,0,1)))

产量

C_0_0_0_0*Q[0, 0] + C_0_0_0_1*Q[0, 0] + C_0_0_1_0*Q[0, 0] + C_0_0_1_1*Q[0, 0] + C_0_1_0_0*Q[0, 1] + C_0_1_0_1*Q[0, 1] + C_0_1_1_0*Q[0, 1] + C_0_1_1_1*Q[0, 1] + C_1_0_0_0*Q[1, 0] + C_1_0_0_1*Q[1, 0] + C_1_0_1_0*Q[1, 0] + C_1_0_1_1*Q[1, 0] + C_1_1_0_0*Q[1, 1] + C_1_1_0_1*Q[1, 1] + C_1_1_1_0*Q[1, 1] + C_1_1_1_1*Q[1, 1]

顺便说一下,sym.summation(..., (i,0,2))总和i等于0,1, 2。 换句话说,与Python的半开放范围不同,sym.summation 范围包括两端。

C = sym.symarray('C', (2,2,2,2))创建一个4维数组,每个维度的长度为2.所以C只能用0和1索引,但不能用2索引。所以要避免索引不在范围错误:

ValueError: Index [0, 0, 2, 0] out of border

使用sym.summation(..., (i,0,1))