【问题标题】:Numpy: can I do tensor Hadamard multiplication without einsum?Numpy:我可以在没有 einsum 的情况下进行张量 Hadamard 乘法吗?
【发布时间】:2016-07-18 18:31:27
【问题描述】:

我有一个四阶张量 A(比如索引 (a, b, i, j))和一个二阶张量 B(比如索引 (i, j)),我想计算一种 Hadamard 乘法其中。

也就是说,如果我们调用产品 C,我想要C[a,b,i,j] == A[a,b,i,j] * B[i,j]。使用einsum 有一种相当简单的方法可以做到这一点,但有人告诉我,与tensordot 之类的方法相比,使用einsum 会对性能造成重大影响,但我找不到避免它的好方法从文档。

我可能错过了它;我是张量的新手,而不是 numpy 的专家。

【问题讨论】:

    标签: python numpy


    【解决方案1】:
    C = A * B
    

    broadcasting rules 之后,NumPy 将从最后一个轴开始排列AB 的形状:

    A: (a, b, i, j)
    B:       (i, j)
    

    AB的对应元素相乘,得到C

       A[a, b, i, j]
    *  B[      i, j]
    == C[a, b, i, j]
    

    【讨论】:

    • 真的等一下吗?我认为形状必须完全匹配才能起作用?如果我想使用其他索引来相乘怎么办?
    • 看起来我想使用交换轴,然后这个,如果我想使用不同的轴,然后再次交换轴 - 例如C[a,i,j,b] == A[a,i,j,b] * B[i,j]。那是处理它的正确方法吗,还是有内置的?
    • @RichardRast:为此,您可以使用C = A * B[..., np.newaxis]
    • @Poik:长度为 1 的轴在确定兼容性时会得到特殊处理,但不会影响对广播的轴的选择。选择哪些轴被广播,其他轴从不取决于轴长度;如果轴不兼容,广播将简单地失败,而不是尝试不同的轴匹配。
    • 是的,这就是我删除上面的 cmets 的原因。我已经承认了。不过,您确实应该在答案中包含有关您的答案的详细信息(并且可能会删除可以被解释为居高临下的句子,因为它是直截了当的)。要我添加吗?
    猜你喜欢
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多