我想在Python中对嵌套的sum进行向量化,以加快这个过程。目前我已经嵌套了for循环。
for ja in np.arange(0,Na):
for jb in np.arange(0,Nb):
for ma in np.arange(-ja,ja+1):
...
最终结果是2x2矩阵之和,每个矩阵的条目取决于ja,jb,ma,mb的值。 矩阵看起来像:
[[f11(ja,jb,ma,mb),f12(ja,jb,ma,mb)],
[f21(ja,jb,ma,mb),f22(ja,jb,ma,mb)]]
其中fij是函数。这些函数可以应用于数组,因为它们将逐个元素地工作(expoenetials,square roots,trig functions等...)。我可以创建像:
这样的数组ja=[0,0,0,1,1,1,2,2,2,3,3,3]
jb=[0,1,2,3,0,1,2,3,0,1,2,3]
使用
range_a = np.arange(0,Na/2+1)
range_b = np.arange(0,Nb/2+1)
ja = np.tile(a_range,Nb/2+1)
jb = np.repeat(b_range,Na/2+1)
但我的麻烦是创建数组,这样对于上面j中的每个值,我们都有m结构(从-j到j):
ma=[0,0,0,-1,-1,-1,0,0,0,1,1,1,-2,-2,-2,...]
mb=[0,-1,0,1,-2,-1,0,1,2,...]
我在制作那些m阵列时遇到了麻烦!每次-j,...,j结构重复时它都有不同的长度,所以我不能使用像numpy.tile
和numpy.repeat
这样的函数。那么,关于如何做到这一点的任何想法?
我的进一步意图可能是相关的:我希望能够用零填充它们并构造2 *长度矩阵,这样只填充一个条目(每个向量需要4个矩阵,总共4个向量)。然后我可以将这些函数应用到并添加这些upp。为了计算2 * 2矩阵的总和,我将使用长度为* 4的矩阵对产品进行点加工。结果是2 * 2。也许存在更好的策略?我以为这之前可能已经发生了,因为它在物理学中有一个共同的应用(跟踪密度算子),但我还没有找到它。