【问题标题】:Matrix multiplication with numpy.einsum与 numpy.einsum 的矩阵乘法
【发布时间】:2015-07-11 09:56:49
【问题描述】:

我有以下两个形状的数组:

    A = (d,w,l)
    B = (d,q)

我想将它们组合成一个具有形状的 3d 数组:

    C = (q,w,l)

更具体地说,在我的情况下,d(3d 数组的深度)为 2,我首先想将 A 的上层中 w * l 中的所有位置相乘(所以 d = 0 ) 在最高行中具有 B 的第一个值(因此 d=0,q=0)。对于 d=1 我也这样做,然后将两者相加:

    C_{q=0,w,l} = A_{d=0,w,l}*B_{d=0,q=0} + A_{d=1,w,l}*B_{d=1,q=0}

我想通过使用 numpy.einsum 来计算 C。我想到了以下代码:

    A = np.arange(100).reshape(2,10,5)

    B = np.arange(18).reshape(2,9)

    C = np.einsum('ijk,i -> mjk',A,B)

其中 ijk 指的是 2,10,5,mjk 指的是 9,10,5。但是我得到一个错误。有没有办法用 numpy einsum 执行这种乘法?

谢谢

【问题讨论】:

  • 快速问题:您的下标字符串中缺少m。应该是np.einsum('ijk,im -> mjk',A,B)?这会创建一个新数组 - 是您正在寻找的吗?
  • 感谢您的回答,但如果我这样做,我会收到以下错误:操作数无法与重新映射的形状一起广播 [original->remapped]: (2,10,5)->( 10,5,2) (9,2)->(2,newaxis,newaxis,9)
  • 当我运行您的“我想到了以下代码”时,但将'ijk,i -> mjk' 更改为'ijk,im -> mjk'(如@ajcr 建议的那样)我没有收到错误。
  • 对不起,你是对的,我把它放在稍微不同的地方。不过还是谢谢!

标签: python arrays numpy


【解决方案1】:

你的形状 A = (d,w,l), B = (d,q), C = (q,w,l) 实际上写成 einsum 表达式

C=np.einsum('dwl,dq->qwl',A,B)

我可以用它来测试

In [457]: np.allclose(A[0,:,:]*B[0,0]+A[1,:,:]*B[1,0],C[0,:,:])
Out[457]: True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2016-10-12
    相关资源
    最近更新 更多