2017-02-13 14 views
5

numpyとtensorflowでは、小さな行列の形がより大きい行列の接尾辞である場合、異なる次元の行列(またはテンソル)を加えることができます。これは一例です。これらの二つの行列演算x+yについては異なる次元の行列を追加する

x = np.ndarray(shape=(10, 7, 5), dtype = float) 
y = np.ndarray(shape=(7, 5), dtype = float) 

があるショートカットの:私の場合は

for a in range(10): 
    for b in range(7): 
     for b in range(5): 
      result[a,b,c] = x[a,b,c] + y[b,c] 

しかし、私は形状(10,7,5)(10,5)の行列があり、同様に私が実行したいと思いますこの場合しかしで

for a in range(10): 
    for b in range(7): 
     for b in range(5): 
      result[a,b,c] = x[a,b,c] + y[a,c] 
             ^

+操作同様のロジックを使用してnumpyもtensorflowも私がしたいことを理解していないので、操作は失敗します。この操作を効率的に実行できる方法はありますか(自分自身でPythonループを書く必要はありません)?これまでのところ、私は私はこのようeinsum使用して形状(10,7,5)の一時的な行列zをご紹介できることを考え出してきて

z = np.einsum('ij,k->ikj', y, np.ones(7)) 
x + z 

をしかし、これは明示的な3次元マトリックス(またはテンソル)を作成し、可能ならば、私はそれを避けることを好むでしょう。 numpyので

答えて

3

、あなたは3Dyを拡張して、追加することができます -

x + y[:,None,:] 

は本当にtensorflowを扱っていませんが、そのドキュメントに探して、それはそうです、私たちはtf.expand_dims使用することができます -

x + tf.expand_dims(y, 1) 

拡張バージョンはまだyのビューになりますので、以下のようにメモリを占有しません。

In [512]: np.may_share_memory(y, y[:,None,:]) 
Out[512]: True 
+0

で見つけることができますか? – Kuba

+0

@Kuba試してください: 'x + tf.expand_dims(y、1)'?ポストに追加されました。 – Divakar

+0

'tf.expand_dims'が動作します!私は答えを受け入れた – Kuba

1

受け入れられた回答で正しく指摘されているように、ソリューションは使用可能な構造を使用してディメンションを拡張することです。

重要なのは、次元が一致しない場合に行列を追加する場合にnumpyが行列をブロードキャストしていることを理解することです。規則は、2つの行列が全く同じ次元を持たなければならないことを除いて、いずれかの行列のいくつかの次元を1で置き換えることができるという規則である。

など。

A  (4d array): 8 x 1 x 6 x 1 
B  (3d array):  7 x 1 x 5 
Result (4d array): 8 x 7 x 6 x 5 

この例と詳細な説明は万が一の対応tensorflowが構築知っていますscipyのダウンロードドキュメント https://docs.scipy.org/doc/numpy-1.10.0/user/basics.broadcasting.html

関連する問題