Python 3:优化scipy数组的求和

时间:2013-09-20 19:39:53

标签: python arrays optimization numpy scipy

我目前正在研究一个问题,我必须对scipy / numpy数组的特定条目进行总结,我正在寻找一种方法来完全摆脱所有Python for循环。我在Mac OS X上使用Python 3.3。下面是我正在做的一个总和的示例,为了示例,我总结了一个填充了随机整数的数组的条目。

from scipy import ones, conjugate, sum, random

n = 5
M = random.randint(5,size=(4*n**2,4*n**2))
H = sum((M[i+1,:2*n**2]*M[i,:2*n**2].conjugate()).sum() * (-M[i,:2*n**2]*M[i+1,:2*n**2].conjugate()).sum() for i in range(0,2*n**2,2))

我首先计算两个矩阵条目的乘积,然后对一半列进行求和。我这样做两次,然后以两步为单位对一半行进行求和。

这可能看起来很奇怪,但我正在使用哈密顿量来处理晶格上的系统,其中每行对应于某个晶格点,偶数和奇数行代表旋转向上或向下。 n最终会很大,我需要加快这个总结。

现在,我无法弄清楚,我怎么能摆脱for循环。我尝试在行索引中使用range() - 参数进行操作,但这并没有给我带来相同的结果。

谢谢!

2 个答案:

答案 0 :(得分:1)

这个怎么样:

# We need a complex test case to make sure the conjugate works properly
M = (random.randint(5,size=(4*n**2,4*n**2)) +
     random.randint(5,size=(4*n**2,4*n**2))*1j)

H_bis = np.sum(M[1:2*n**2:2, :2*n**2] * M[:2*n**2:2, :2*n**2].conjugate(),
               axis=-1)
H_bis *= np.sum(-M[:2*n**2:2, :2*n**2] * M[1:2*n**2:2, :2*n**2].conjugate(),
                axis=-1)
H_bis = np.sum(H_bis)
>>> np.allclose(H, H_bis)
True

答案 1 :(得分:1)

在我看来,你可以做到

H_bis = np.sum(M[1:2*n**2:2, :2*n**2] * M[:2*n**2:2, :2*n**2].conjugate(), axis=1)
H_bis = H_bis * H_bis.conjugate()
H_bis = -np.sum(H_bis)