2017-07-28 42 views
2

給定兩個numpy的陣列,其中所述第一d尺寸在尺寸點積軸

import numpy 

d = 3 
a = numpy.random.rand(2, 2, 2, 12, 3) 
b = numpy.random.rand(2, 2, 2, 5) 

等於我想計算跨越那些第一尺寸的點積。這

a2 = a.reshape(-1, *a.shape[d:]) 
b2 = b.reshape(-1, *b.shape[d:]) 
out = numpy.dot(numpy.moveaxis(a2, 0, -1), numpy.moveaxis(b2, 0, -2)) 

作品,但只有當b是形狀(2, 2, 2)的不是。與reshapemoveaxis混亂也似乎比必要更復雜。

是否有更優雅的解決方案? (也許tensordot?)

+1

'tensordot'確實重塑和軸移動,直到它可以將任務交給'dot'。然後重新塑形。 – hpaulj

回答

1

原來,tensordot畢竟是有幫助。這

numpy.tensordot(a, b, axes=(range(3), range(3))) 

的伎倆。

+1

顯然是一個更好的解決方案,對於壞,我真的很喜歡'np.einsum' –

+0

我也是,實際上。一旦你掌握了語法,你幾乎可以做任何事情。幾乎。 –

2

再次使用np.einsum

np.einsum('ijklm,ijkn->lmn',a,b) 
+0

我想這將需要適應d不同於3,或額外的維數不同。 –

+0

是的,你必須。 'np.einsum'允許省略號,但我認爲你能得到的最好的東西就像'np.einsum('ijklm,ijk ...-> lm ...',a,b)'。特別是你不能總結一個未指定數目的軸。 –

+0

我想至少lm部分可以被替換?對於ijk,可以構造字符串直到字母表用完。 –