2016-04-08 6 views
3

私は複雑な2次元配列xのpairwise np.vdotをそれ自身で計算しようとしています。だから、私が欲しいの動作は次のとおりです。Numpyを使ったペアワイド

X = np.empty((x.shape[0], x.shape[0]), dtype='complex128') 
for i in range(x.shape[0]): 
    for j in range(x.shape[0]): 
     X[i, j] = np.vdot(x[i], x[j]) 

は、明示的なループせずにこれを行う方法はありますか?私は、からpairwise_kernelを使ってみましたが、入力配列が実数であると仮定しています。私も放送しようとしましたが、vdotはその入力を平らにします。

答えて

3
X = np.einsum('ik,jk->ij', np.conj(x), x) 

X = np.empty((x.shape[0], x.shape[0]), dtype='complex128') 
for i in range(x.shape[0]): 
    for j in range(x.shape[0]): 
     X[i, j] = np.vdot(x[i], x[j]) 

np.einsum と同等である積の和をとります。第2引数は、 np.conj(x)は添字ikと三番目の引数を持つ配列であるnp.einsumに指示'ik,jk->ij'添字、xjk添え字を有します。したがって、全ての製品についてnp.conj(x)[i,k]*x[j,k]が計算される。 i,j,k。合計は、反復された添え字kを引き継いでおり、 が残っているので、ijが残っているので、結果の配列の添字になります。


例えば、

import numpy as np 

N, M = 10, 20 
a = np.random.random((N,M)) 
b = np.random.random((N,M)) 
x = a + b*1j 

def orig(x): 
    X = np.empty((x.shape[0], x.shape[0]), dtype='complex128') 
    for i in range(x.shape[0]): 
     for j in range(x.shape[0]): 
      X[i, j] = np.vdot(x[i], x[j]) 
    return X 

def alt(x): 
    return np.einsum('ik,jk->ij', np.conj(x), x) 

assert np.allclose(orig(x), alt(x)) 

In [307]: %timeit orig(x) 
10000 loops, best of 3: 143 µs per loop 

In [308]: %timeit alt(x) 
100000 loops, best of 3: 8.63 µs per loop 
3

あなたがnp.tensordotを使用することができますし、私はそうのように、まっすぐ@unutbu's solutionオフ共役アイデアを借りています、すべての行にnp.vdotを拡張するには -

np.tensordot(np.conj(x),x,axes=(1,1)) 

基本的にnp.tensordotとすると、縮小する軸を指定します。この場合は、共役バージョンの最後の軸はxであり、配列自体はその2つに適用されます。

ランタイムテスト -

レッツ・時間@unutbu's solution with np.einsumと、この記事で提案された解決策 -

In [27]: import numpy as np # From @unutbu's` solution again 
    ...: 
    ...: N, M = 1000, 1000 
    ...: a = np.random.random((N,M)) 
    ...: b = np.random.random((N,M)) 
    ...: x = a + b*1j 
    ...: 

In [28]: %timeit np.einsum('ik,jk->ij', np.conj(x), x) # @unutbu's` solution 
1 loops, best of 3: 4.45 s per loop 

In [29]: %timeit np.tensordot(np.conj(x),x,axes=(1,1)) 
1 loops, best of 3: 3.76 s per loop 
関連する問題