9

n 個の外積の合計をすばやく計算する方法を探しています。

基本的に、正規分布から生成された 2 つの行列から始めます。v 要素を持つ n 個のベクトルがあります。

A = np.random.normal(size = (n, v))
B = np.random.normal(size = (n, v))

私が望むのは、A と B のサイズ v の各ベクトルの外積を計算し、それらを合計することです。

機能しないことに注意してくださいA * B.T-Aのサイズはnxvですが、Bのサイズはvx nです。

私ができる最善の方法は、外積が構築され、後で合計されるループを作成することです。私はそれを次のように持っています:

outers = np.array([A[i] * B[i].T])

これにより、nxvxv 配列が作成され (ループはリスト内包表記内にあり、後で配列に変換されます)、これを を使用して合計できnp.sum(outers, axis = 0)ます。ただし、これは非常に遅いため、これを高速化するために使用できるベクトル化された関数があるかどうか疑問に思っていました。

誰かアドバイスがあれば、本当に感謝します!

4

2 に答える 2

15

あなたがする必要があるのは、転置の順序を変更することだけであり、A.T * B代わりにA * B.T.

それがあなたの求めているものではない場合は、np.einsum非常に強力なブードゥーを行うことができる を見てください. 上記の例では、次のようにします。

np.einsum('ij,ik->jk', A, B)
于 2013-07-02T23:49:43.213 に答える