在 python 中高效计算三阶张量
Computing a third order tensor efficiently in python
若x
表示d
维列向量,e_i
表示欧氏i
第spaceR^d
标准基,我想以一种有效的方式计算 python 中的以下三阶张量:
这里画圈的叉指的是张量外积。现在我一直依赖以下相当低效的代码:
import numpy as np
from sktensor import ktensor,dtensor
d=5
x= np.random.normal(0,1,(d,1))
z= np.zeros((d,1))
I= np.identity(d)
T1= ktensor([x,x,x])
T2= ktensor([z,z,z])
T3= ktensor([z,z,z])
T4= ktensor([z,z,z])
for j in range(d):
T2 = T2+ ktensor([I(:,j),I(:,j),x]
T3 = T3+ ktensor([I(:,j),x,I(:,j)]
T4 = T4+ ktensor([x,I(:,j),I(:,j)]
T= T1-T2-T3-T4
根据 OP 评论的要求,numpy
基于答案。未针对 sktensor
进行测试
import numpy as np
np.random.seed(42)
d = 5
x = np.random.normal(0,1, size=(d,1))
I = np.identity(d)
ans = np.outer(x, np.outer(x, x))
for i in range(d):
ans -= np.outer(I[:, i], np.outer(I[:, i], x))
ans -= np.outer(I[:, i], np.outer(x, I[:, i]))
ans -= np.outer(x, np.outer(I[:, i], I[:, i]))
若x
表示d
维列向量,e_i
表示欧氏i
第spaceR^d
标准基,我想以一种有效的方式计算 python 中的以下三阶张量:
这里画圈的叉指的是张量外积。现在我一直依赖以下相当低效的代码:
import numpy as np
from sktensor import ktensor,dtensor
d=5
x= np.random.normal(0,1,(d,1))
z= np.zeros((d,1))
I= np.identity(d)
T1= ktensor([x,x,x])
T2= ktensor([z,z,z])
T3= ktensor([z,z,z])
T4= ktensor([z,z,z])
for j in range(d):
T2 = T2+ ktensor([I(:,j),I(:,j),x]
T3 = T3+ ktensor([I(:,j),x,I(:,j)]
T4 = T4+ ktensor([x,I(:,j),I(:,j)]
T= T1-T2-T3-T4
numpy
基于答案。未针对 sktensor
import numpy as np
np.random.seed(42)
d = 5
x = np.random.normal(0,1, size=(d,1))
I = np.identity(d)
ans = np.outer(x, np.outer(x, x))
for i in range(d):
ans -= np.outer(I[:, i], np.outer(I[:, i], x))
ans -= np.outer(I[:, i], np.outer(x, I[:, i]))
ans -= np.outer(x, np.outer(I[:, i], I[:, i]))