2017-12-31 62 views
1

機械学習のコンテキストでは、要素ごとの乗算を行う必要があります。z方向のナンシー放送

import numpy as np 

a = np.linspace(1,12,12) 
a = a.reshape(3,2,2) 

# what to put here? 
<some statements> 

print a 

# result: 
[[[ 1. 2.] 
    [ 3. 4.]] 

[[ 1. 2.] 
    [ 3. 4.]] 

[[ 5. 6.] 
    [ 7. 8.]] 

[[ 5. 6.] 
    [ 7. 8.]] 

[[ 9. 10.] 
    [ 11. 12.]] 

[[ 9. 10.] 
    [ 11. 12.]]] 

何文(S:N = 2で、次の例で示すように効率的にこれを行うために、私は、特定の方法で、各2×2行列が繰り返されるN回3Dテンソルの要素をブロードキャストする必要があります)は仕事をするだろうか?

ありがとうございます!ここで

+0

素晴らしい、ありがとう@Divakar!あなたが答えとしてそれを入れたいなら、私はそれを解決としてマークします。 – tronda

答えて

3

あなたは3D配列としてaを持った後、第1の軸に沿って再現するnp.repeatと一つだ -

N = 2 # replication number 
out = np.repeat(a,N,axis=0) 

また、4D読み取り専用出力のために、私たちはnp.broadcast_toでビューを作成することができ、それは希望私たちは余分なメモリを奪うことはありませんので、非常に効率的です -

m,n,r = a.shape 
out = np.broadcast_to(a[:,None],(m,N,n,r)) 

# Confirm it's a view 
In [32]: np.shares_memory(a, out) 
Out[32]: True 
+0

'np.tile'も使用できますか?私はこの 'np.tile(a、(2、1、1))'のようにしようとしていましたが、繰り返しは連続していませんでした:(形は完全に – kmario23

+1

@ kmario23に一致しますが、 a.reshape(-1,4)、2).reshape(-1,2,2) '。書式は常に便利です:) – Divakar