【问题标题】:Specific tensor product in numpynumpy中的特定张量积
【发布时间】:2017-07-14 19:50:32
【问题描述】:

我想对矩阵进行以下运算:

import numpy as np

x = np.arange(9).reshape((3,3))
result = np.zeros((3,3,3))
for i in range(3):
    for j in range(3):
        for k in range(3):
            result[i,j,k] = x[j,i] * x[j,k]

这给了

array([[[  0.,   0.,   0.],
        [  9.,  12.,  15.],
        [ 36.,  42.,  48.]],

       [[  0.,   1.,   2.],
        [ 12.,  16.,  20.],
        [ 42.,  49.,  56.]],

       [[  0.,   2.,   4.],
        [ 15.,  20.,  25.],
        [ 48.,  56.,  64.]]])

正如预期的那样。

问题

如何使用 numpy 使用张量积(无循环)执行此计算?

编辑

如果 X 的元素是向量,则运算改为:

result[i,j,k] = np.dot(x[j,i] , x[j,k])

什么是适合这个计算的 numpy 运算符?

【问题讨论】:

    标签: python numpy matrix tensor


    【解决方案1】:

    使用迭代器作为带有np.einsum 的字符串表达式的简单方法是 -

    np.einsum('ji,jk->ijk',x,x)
    

    另一个 broadcasting 和交换轴 -

    (x[:,None,:]*x[:,:,None]).swapaxes(0,1)
    

    【讨论】:

    • 谢谢!我忘了提到我不是在寻找np.einsum 的解决方案。广播解决方案很整洁!但我想知道是否有使用np.tensordot 的解决方案(因为真正的问题意味着点积 - 请参阅我的编辑)或类似的东西。我实际上是在 theano 中实现的,这对广播施加了限制..
    • @Tool 那么,theano 支持广播吗?有什么限制?因为,我们需要保持一个轴对齐(在这种情况下是第一个轴),如果没有过多的内存使用,numpy.dot 或 numpy.tensordot 将无法工作。 numpy.matmul 可能有效,但再次想知道在 theano 中是否有任何等价物。
    • 我刚刚查过,theano 确实支持广播(与 numpy 相同):) tensordot 不应该使用广播吗?与您当前使用点积而不是常规积的答案等效的是什么?
    • @Tool 请参阅here 以获取示例解释以及为什么 tensordot 无法工作/至少在没有更多变通方法且没有性能优势的情况下。在您的情况下,没有总和减少,而是全部扩展。因此,broadcasting 将是正确的选择。
    • dot 产品是产品的总和。 tensordot 使用转置和整形将问题简化为 dot 调用。但你没有总结任何东西。这是一种外在产品,广播做得很好。甚至einsum 解决方案也不能求和。
    猜你喜欢
    • 2019-01-07
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多