2016-08-12 4 views
0

Ich habe das folgende mehrdimensionale Array. Die erste Achse bezeichnet einen 3-dimensionalen Vektor. Ich möchte die 3-mal-3-Matrix xx 'für jeden der diejenigen berechnen.Wie verwende ich Broadcasting, um diesen Code zu beschleunigen?

Meine aktuelle Lösung:

arr.shape 
# (3, 64, 64, 33, 187) 

dm = arr.reshape(3,-1) 
dm.shape 
# (3, 25276416) 

cov = np.empty((3,3,dm.shape[1])) 
cov.shape 
# (3, 3, 25276416) 

dies für-Schleife iteriert über alle 25.276.416 Elemente und dauert etwa 1 oder 2 min.

for i in range(dm.shape[1]): 
    cov[...,i] = dm[:,i].reshape(3,1).dot(dm[:,i].reshape(1,3)) 

cov = cov.reshape((3,) + arr.shape) 
cov.shape 
# (3, 3, 64, 64, 33, 187) 

Antwort

1

Nun, Sie reduzieren nicht wirklich alle Achsen mit dieser Matrix-Multiplikation mit np.dot und es ist nur element Multiplikation dort ausgestrahlt. So können Sie einfach NumPy broadcasting für die ganze Sache verwenden, wie so -

cov = dm[:,None]*dm 

Oder es verwenden, um direkt auf arr zu vermeiden dm zu schaffen und alles, Umbildung, wie so -

cov = arr[:,None]*arr 
Verwandte Themen