A = [a1, a2]
,B = [b1, b2]
,C = [c1, c2]
,D = [d1, d2]
。
A, B, C, D
的外部乘积就是:
[
[
[[a1*b1*c1*d1, a1*b1*c1*d2], [a1*b1*c1*d1, a1*b1*c2*d2]],
[[a1*b2*c2*d1, a1*b2*c1*d2], [a1*b2*c2*d1, a1*b2*c2*d2]]
],
[
[[a2*b1*c1*d1, a2*b1*c1*d2], [a2*b1*c2*d1, a2*b1*c2*d2]],
[[a2*b2*c1*d1, a2*b2*c1*d2], [a2*b2*c2*d1, a2*b2*c2*d2]]
]
]
在numpy中,外部乘积因此是形状为(2, 2, 2, 2)
的数组。我知道该怎么做。问题是,我有100种这样的A,B,C,D。它们通过固定k从A_k,B_k,C_k,D_k中获取。因此,它们实际上是形状为(2,100)或(100,2)的数组。实际上可能是(20,100)或(100,20)。我用2简化了写作。我想做的是:将这种外部产品做100次,然后进行总结。即:求和100个形状(2、2、2、2)的数组。如何使用numpy有效地做到这一点?如果更好,有没有GPU加速方法可以做到这一点?
如果A,B,C,D只是一维数组,我知道该怎么做。以下单行代码可以正常工作:
a[:, None, None, None] * b[None, :, None, None] * c[None, None, :, None] * d[None, None, None, :]