numpy:如何执行四个向量的外积然后求和?

时间:2019-08-07 21:01:32

标签: python-3.x numpy tensor

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, :]

1 个答案:

答案 0 :(得分:1)

numpy.einsum加上numpy.sum并仔细选择了轴,应该会为您提供所需的东西。