2017-12-31 116 views
1

In einem Machine Learning-Kontext muss ich eine Multiplikation pro Element durchführen. Zu tun effizient Dazu brauche ich Elemente eines 3D-Tensor in einer bestimmten Art und Weise zu übertragen, so dass jede 2x2-Matrix wird n-mal wiederholt, wie das folgende Beispiel zeigt mit n = 2:Numpy Broadcasting in z-Richtung

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.]]] 

Welche Aussage (n) würde die Arbeit machen?

Danke!

+0

Fantastisch, danke @Divakar! Wenn Sie es als Antwort setzen wollen, werde ich es als gelöst markieren. – tronda

Antwort

3

Hier ist eine mit np.repeat entlang der ersten Achse replizieren, nachdem Sie a als 3D Array -

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

Alternativ kann für eine 4D Nur-Lese-Ausgabe, können wir eine Ansicht mit np.broadcast_to schaffen und das würde sehr effizient sein, da wir keine zusätzlichen Speicher, wie so werden -

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

Ist es auch möglich, 'np.tile' zu ​​verwenden? Ich habe versucht, so 'np.tile (a, (2, 1, 1)) 'aber die Wiederholung ist nicht aufeinanderfolgend :(obwohl die resultierende Form perfekt übereinstimmt – kmario23

+1

@ kmario23 Yup! Mit wenigen Umbauten - ' np.tile (a.reshape (-1,4), 2) .reshape (-1,2,2) '. Umformungen sind immer praktisch :) – Divakar