2

私は現在、scipy/numpy 配列の特定のエントリを合計する必要がある問題に取り組んでおり、すべての Python for ループを完全に取り除く方法を探しています。私は Mac OS X で Python 3.3 を使用しています。以下は、私が行っている合計の 1 つの例です。例のために、ランダムな整数で満たされた配列のエントリを合計します。

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))

最初に 2 つのマトリックス エントリの積を計算し、次に列の半分以上を合計します。これを 2 回行い、行の半分以上を 2 段階で合計します。

これは奇妙に見えるかもしれませんが、私は格子上のシステムのハミルトニアンを扱っています。各行は特定の格子点に対応し、偶数行と奇数行はスピンアップまたはスピンダウンを表します。n は最終的には大きくなり、この合計を少し高速化する必要があります。

今、どうすれば for ループを取り除くことができるのかわかりません。行インデックスに range() 引数を付けて実行しようとしましたが、同じ結果にはなりませんでした。

ありがとう!

4

2 に答える 2

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)
于 2013-09-20T20:28:05.103 に答える