2

N x N以下と呼ばれる配列で、次の三重積演算をベクトル化しようとしていpます。

for j in range(len(p)):
    for k in range(len(p)):
        for l in range(len(p)):
            h[j, k, l] = p[j, k] * p[k, l] * p[l, j] - p[j, l] * p[l, k] * p[k, j]

numpy.einsum繰り返されるインデックスを実際に合計しているわけではありませんが、ここで役立つはずだと思いましたが、特定できませんでした。考え?

4

1 に答える 1

4

これらのループ反復子を文字列表記として移植するだけで、次のeinsumようなベースのソリューションが得られます-

h = np.einsum('jk,kl,lj->jkl',p,p,p) - np.einsum('jl,lk,kj->jkl',p,p,p)

基本的に拡張関連の質問であるため (軸を縮小していないため) 、拡張を可能にするためにさまざまな場所にNumPy broadcasting新しい軸を導入することで簡単に使用できますNone/np.newaxis-

h = p[...,None]*p*p[:,None,:].T - p[:,None,:]*p.T*p.T[...,None]
于 2016-07-18T02:37:50.290 に答える