首页 > 解决方案 > Numpy:如何执行四个向量的外积然后求和?

问题描述

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 中,外部产品因此是一个 shape 数组(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, :]

标签: python-3.xnumpytensor

解决方案


numpy.einsum加上仔细选择轴的 numpy.sum 应该可以满足您的需求。


推荐阅读