2d 与 3d numpy 数组的和乘积加上标量计算

sum product of 2d with 3d numpy arrays plus a scalar computation

刚刚问了一个基本的 早些时候关于两个 2d 数组的点积,希望我能弄清楚如何将逻辑扩展到以下问题,其中一个矩阵实际上是 3d,然后进一步相乘通过一维标量向量,但没有成功...对于背靠背的问题感到抱歉,numpy 看起来比我想象的要复杂得多..

我有以下3个数组

a = np.array([[1, 2, 3], [3, 4, 5]])
b = np.array([[[1, 0, 1], [1, 1, 0], [0, 1, 1]], [[1, 1, 1], [0, 1, 0], [0, 0, 1]]])
c = np.array([1, 2, 3])

我想做以下计算。我只是直接输入公式,因为我不确定如何用语言正确描述它(如果有人能启发我,我也很想知道!)...

[[(1*1 + 0*2 + 1*3)/1, (1*1 + 1*2 + 0*3)/2, (0*1, 1*2, 1*3)/3],
 [(1*3 + 1*4 + 1*5)/1, (0*3 + 1*4 + 0*5)/2, (0*3, 0*4, 1*5)/3]]

>>> [[4, 1.5, 1.67], [12, 2, 1.67]]

它可能与如何使用轴 arg 有关,但我还不太清楚...再次感谢!!

这可能不是您想要的(因为它使用列表重塑 numpy 数组,效率不高),但它似乎有效:

d = np.array([[row]*3 for row in a]) #reshape np.array to 3d
print((d*b).sum(axis=2)/c)

正确答案:np.sum((a[:,None,:] * b), axis=2) / c

可视化一步步处理:

补充评论

  1. a[:,None,:] 在尺寸 1 的中间插入一个额外的维度。a.shape(2, 3)a[:,None,:](2, 1, 3)a[None,:,:][a[:,:,None] 做同样的事情,你可以用 shape 参数检查它。

  2. 理解这个问题的方法之一是视觉。所有图片都展示了三个维度如何对应 axis=0axis=1axis=2。所以如果你有一个 shape = (2, 1, 3) 的数组,它的可视化将是一个高度 = 2,宽度 = 1 和长度 = 3 的长方体。例如,你可以看到 visually 如何a[:,:,None]b 被广播到一个新数组 a[:,:,None] * b.

  3. 还有一种符号(正式)方式来查看它。只能广播平衡形状阵列。因此形状数组 (2, 3)(2, 1, 3) 不能广播到形状数组 (2, 3, 3)(2, 1, 3)但是, 形状数组 (4, 3)(3,) 可以广播。我的意思是,有 mathematical rules 定义数组是否可广播。