2016-11-15 14 views
3

numpyの行列演算を見つけようとしていますが、次のループコードと同じ結果が得られます。私はそれがはるかに速くなると信じていますが、私はそれを行うためのいくつかのpythonのスキルが欠けている。2つの配列の対応するリストの外積の合計 - NumPy

これは行単位で動作し、xの行の各値にeの同じ行の各値が乗算されて合計されます。

結果の最初の項目は(2 * 0 + 2 * 1 + 2 * 4 + 2 * 2 + 2 * 3)+(0 * 0 + ...)+ ... + 0 + 1 * 1 + 1 * 4 + 1 * 2 + 1 * 3)= 30

e = np.array([[0,1,4,2,3],[2,0,2,3,0,1]]) 
x = np.array([[2,0,0,0,1],[0,3,0,0,4,0]]) 
result = np.zeros(len(x)) 
for key, j in enumerate(x): 
    for jj in j: 
     for i in e[key]: 
      result[key] += jj*i 
>>> result 
Out[1]: array([ 30., 56.]) 

答えて

1

これは、長さの異なるリストを持つため、不揃いな配列です。可能であれば、完全にベクトル化されたアプローチは簡単ではありません。ここでは、ループの理解でnp.einsumを使用して1だ -

[np.einsum('i,j->',x[n],e[n]) for n in range(len(x))] 

サンプル実行 -

In [381]: x 
Out[381]: array([[2, 0, 0, 0, 1], [0, 3, 0, 0, 4, 0]], dtype=object) 

In [382]: e 
Out[382]: array([[0, 1, 4, 2, 3], [2, 0, 2, 3, 0, 1]], dtype=object) 

In [383]: [np.einsum('i,j->',x[n],e[n]) for n in range(len(x))] 
Out[383]: [30, 56] 

あなたはまだ完全にベクトル化されたアプローチに関する永続的な感じている場合は、あなたが小さいリストで定期配列を作ることができます満ちているゼロ。同じ場合は、postに記入するNumPyベースのアプローチを示します。

したら、私たちはxeとして規則的な形状の配列を持って、最終的な結果は、単にだろう - あなたが答えるために

np.einsum('ik,il->i',x,e) 
+0

ありがとうございました。リストにゼロを追加して長さを同じにするとどうなりますか? Dakota Dutkoが示唆したように、私のループの結果は変わらず、おそらく私はドットプロダクトを使うことができますか? – Daerken

+0

@Daerken通常の形状の配列の使い方に関する記事を編集しました。見てみな。 – Divakar

+0

ニース:)ありがとう! – Daerken

関連する問題