应用程序的核心(用Python编写并使用NumPy)我需要旋转4阶张量.实际上,我需要多次旋转很多张量,这是我的瓶颈.我的天真实现(下面)涉及八个嵌套循环似乎相当慢,但我看不到一种方法来利用NumPy的矩阵运算,并希望加快速度.我有一种感觉,我应该使用np.tensordot,但我不知道如何.
在数学上,旋转张量,T的元素"由下式给出:T" IJKL =Σ克IA克JB克KC克LD Ť ABCD与和被过在右手侧上的重复指数.T和Tprime是3*3*3*3个NumPy阵列,旋转矩阵g是3*3 NumPy阵列.我执行缓慢(每次通话约0.04秒)如下.
#!/usr/bin/env python
import numpy as np
def rotT(T, g):
Tprime = np.zeros((3,3,3,3))
for i in range(3):
for j in range(3):
for k in range(3):
for l in range(3):
for ii in range(3):
for jj in range(3):
for kk in range(3):
for ll in range(3):
gg = g[ii,i]*g[jj,j]*g[kk,k]*g[ll,l]
Tprime[i,j,k,l] = Tprime[i,j,k,l] + \
gg*T[ii,jj,kk,ll]
return Tprime
if __name__ == "__main__":
T = …Run Code Online (Sandbox Code Playgroud) 对于我的客户来说,迭代多个计数器正在变成一个重复的任务.
最直接的方式是这样的:
cntr1 = range(0,2)
cntr2 = range(0,5)
cntr3 = range(0,7)
for li in cntr1:
for lj in cntr2:
for lk in cntr3:
print li, lj, lk
Run Code Online (Sandbox Code Playgroud)
计数器的数量可以是从3开始的任何地方,而那些嵌套的循环开始占用房地产.
有没有Pythonic的方法来做这样的事情?
for li, lj, lk in mysteryfunc(cntr1, cntr2, cntr3):
print li, lj, lk
Run Code Online (Sandbox Code Playgroud)
我一直认为itertools中的某些东西符合这个法案,但我对itertools不太熟悉,无法理解这些选项.有没有像itertools这样的解决方案,还是我需要自己动手?
谢谢,j