【发布时间】: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 建议的那样)我没有收到错误。 -
对不起,你是对的,我把它放在稍微不同的地方。不过还是谢谢!