2017-07-28 69 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,可以构造字符串直到字母表用完。 –