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
可视化一步步处理:
补充评论
a[:,None,:]
在尺寸 1 的中间插入一个额外的维度。a.shape
是 (2, 3)
,a[:,None,:]
是 (2, 1, 3)
。 a[None,:,:]
和 [a[:,:,None]
做同样的事情,你可以用 shape
参数检查它。
理解这个问题的方法之一是视觉。所有图片都展示了三个维度如何对应 axis=0
、axis=1
、axis=2
。所以如果你有一个 shape = (2, 1, 3)
的数组,它的可视化将是一个高度 = 2,宽度 = 1 和长度 = 3 的长方体。例如,你可以看到 visually 如何a[:,:,None]
和 b
被广播到一个新数组 a[:,:,None] * b
.
还有一种符号(正式)方式来查看它。只能广播平衡形状阵列。因此形状数组 (2, 3)
和 (2, 1, 3)
不能广播到形状数组 (2, 3, 3)
和 (2, 1, 3)
。 但是, 形状数组 (4, 3)
和 (3,)
可以广播。我的意思是,有 mathematical rules 定义数组是否可广播。
刚刚问了一个基本的
我有以下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
可视化一步步处理:
补充评论
a[:,None,:]
在尺寸 1 的中间插入一个额外的维度。a.shape
是(2, 3)
,a[:,None,:]
是(2, 1, 3)
。a[None,:,:]
和[a[:,:,None]
做同样的事情,你可以用shape
参数检查它。理解这个问题的方法之一是视觉。所有图片都展示了三个维度如何对应
axis=0
、axis=1
、axis=2
。所以如果你有一个shape = (2, 1, 3)
的数组,它的可视化将是一个高度 = 2,宽度 = 1 和长度 = 3 的长方体。例如,你可以看到 visually 如何a[:,:,None]
和b
被广播到一个新数组a[:,:,None] * b
.还有一种符号(正式)方式来查看它。只能广播平衡形状阵列。因此形状数组
(2, 3)
和(2, 1, 3)
不能广播到形状数组(2, 3, 3)
和(2, 1, 3)
。 但是, 形状数组(4, 3)
和(3,)
可以广播。我的意思是,有 mathematical rules 定义数组是否可广播。