Python 二维与三维numpy数组的和积加上标量计算

Python 二维与三维numpy数组的和积加上标量计算,python,numpy,numpy-ndarray,Python,Numpy,Numpy Ndarray,刚才问了一个关于两个2d数组的点积的基本问题,希望我能把逻辑扩展到下面的问题,其中一个矩阵实际上是3d的,然后再乘以1d标量向量,但没有成功。。。很抱歉问了这么多背靠背的问题,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

刚才问了一个关于两个2d数组的点积的基本问题,希望我能把逻辑扩展到下面的问题,其中一个矩阵实际上是3d的,然后再乘以1d标量向量,但没有成功。。。很抱歉问了这么多背靠背的问题,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]]

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

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

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

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

d = np.array([[row]*3 for row in a]) #reshape np.array to 3d
print((d*b).sum(axis=2)/c)
正确答案:np.suma[:,无,:]*b,轴=2/c

逐步可视化处理:

补充意见

A[[,无,]:]在1号大小的中间插入一个额外的维度。a、 形状是2,3,a[:,无,:]是2,1,3。a[None,:,:]和[a[:,:,None]执行相同的操作,您可以使用形状参数进行检查

理解这个问题的方法之一是可视化。所有图片都演示了三维如何对应于轴=0,轴=1,轴=2。因此,如果你有一个形状=2,1,3的数组,它的可视化将是一个高度=2,宽度=1,长度=3的长方体。例如,你可以直观地看到[:,:,无]和b被广播到新数组a[:,:,None]*b中

也有一种符号形式的方式来看待它。只有平衡形状的数组才能被广播。因此,形状2,3和2,1,3的数组不可能被广播。形状2,3,3和2,1,3的数组不太可能被广播。但是,形状4,3和3的数组可以被广播。我的意思是,有定义数组是否可以被广播

正确答案:np.suma[:,无,:]*b,轴=2/c

逐步可视化处理:

补充意见

A[[,无,]:]在1的大小中间插入一个额外的维度。A.形状是2, 3,A[,,无,]是2, 1, 3。A[[,,:] ]和[A]:,No.]没有一样,可以用形状参数来检查它。

理解这个问题的方法之一是可视化。所有图片都演示了三维如何对应于轴=0,轴=1,轴=2。因此,如果你有一个形状=2,1,3的数组,它的可视化将是一个高度=2,宽度=1,长度=3的长方体。例如,你可以直观地看到[:,:,无]和b被广播到新数组a[:,:,None]*b中

也有一种符号形式的方式来看待它。只有平衡形状的数组才能被广播。因此,形状2,3和2,1,3的数组不可能被广播。形状2,3,3和2,1,3的数组不太可能被广播。但是,形状4,3和3的数组可以被广播。我的意思是,有定义数组是否可以被广播


谢谢你的回答,更重要的是我对视觉化的理解。我不能完全理解a[:,None,:]是如何把它变成2,1,3的……你能给我更多的见解吗?因为我继续尝试了[None,:,:]和a[:,:,None]但我还是不太明白为什么输出是这样的……让我惊讶的是,a[None,:,:]是一个本身。@mathfux:你用什么来绘制这些图?@tgrandje这是我自己的工具。在sputnik_脚本和sputnik_gallery目录中查看sputnik5,你会发现我用来创建这个可视化的脚本。@minovsky不,a[None,:,:]与a:array[[1,2,3],[3,4,5]]≠ 数组[[1,2,3],[3,4,5]]。主要区别在于它们的形状不同。@minovsky检查我对答案的更新。你可能也希望看到这一点,这是我想法的基础。谢谢你的答案,更重要的是我对可视化的理解。我无法完全理解[:,无,:]我努力把它变成2,1,3…你能给我更多的见解吗?当然,因为我试了一个[None,:,:]和一个[:,:,None],但我还是不太明白为什么输出是这样的…让我惊讶的是,一个[None,:,:,:]是一个本身。@mathfux:你用什么来绘制这些图?@tgrandje这是我自己的工具。在sputnik_脚本和sputnik_gallery目录中查看sputnik5,你会发现我用来创建这个可视化的脚本。@minovsky不,a[None,:,:]与a:array[[1,2,3],[3,4,5]]≠ 数组[[1,2,3],[3,4,5]]。主要区别在于它们的形状不同。@minovsky检查我更新的答案。你可能还希望看到这一点,这是我的想法的基础。写出
乘法和求和部分经常使用爱因斯坦符号。这也直接导致了一个可能的实现np.einsumij,ixj->ix,a,b/c。编写乘法和求和部分的公式通常使用爱因斯坦符号。这也直接导致了一个可能的实现np.einsumij,ixj->ix,a,b/c。