【问题标题】:elementwise outer product of tensors using einsum使用 einsum 的张量的元素外积
【发布时间】:2018-02-10 08:30:56
【问题描述】:

我有以下两个数组:

foo = np.array([1,2,3,4,5,6,7,8,9])

bar = np.array([k1, k2, k3])

在哪里

k1 = np.array([[1],[2]])
k2 = np.array([[4],[6]])
k3 = np.array([[9],[3]])

我想找到foobar 中每三分之一的elementwise outer product。换句话说 foo 需要重新排列 在输入np.outer之前如下:

[array([1, 2, 3]), array([4, 5, 6]), array([7, 8, 9])]

这是我所做的。

def elmntwise_outer_prod(arr1, arr2):
    arr1 = np.split(arr1, 3)
    out = [np.outer(val1, val2) for val1, val2 in zip(arr1, arr2)]
    return np.array(out)

现在,当我执行 elmntwise_outer_prod(foo, bar) 时,它会为我提供所需的输出

array([[[ 1,  2],
    [ 2,  4],
    [ 3,  6]],

   [[16, 24],
    [20, 30],
    [24, 36]],

   [[63, 21],
    [72, 24],
    [81, 27]]])

问题有没有更好的方法来做到这一点?特别是,如果有的话,我怎样才能使用np.einsum 来更有效地编写这个?我已经阅读了解决类似问题的先前问题,但我似乎无法理解这一点。我还阅读了 this 博客文章 RE np.einsum

有什么帮助吗?

【问题讨论】:

    标签: python numpy tensor numpy-einsum


    【解决方案1】:

    不涉及减和,所以我们可以简单地使用broadcasting -

    (foo.reshape(-1,3)[:,None,:]*bar).swapaxes(1,2)
    # or foo.reshape(-1,3)[...,None]*bar[:,None,:,0]
    

    如果你必须使用np.einsum -

    np.einsum('ij,ikl->ijk',foo.reshape(-1,3), bar)
    

    【讨论】:

    • 也许.reshape(-1, 1, 3).reshape(-1, 3)[:, None, :]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 2016-06-03
    • 2016-10-26
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 2020-04-15
    相关资源
    最近更新 更多