我应该如何将3d数组中的1d数组乘以ndy的2d矩阵

时间:2016-09-04 12:05:14

标签: python arrays numpy

我想要进行下面的计算。本例中使用的值在实际情况中是可变的。

{{1}}

他们的任何有效方式是否满足上述计算numpy。 事实上,我并不清楚如何应用多维数组的numpy。因此,如果你知道有用的文档来理解操作多维数组规则,如果你让我知道,我很高兴。

1 个答案:

答案 0 :(得分:3)

您可以使用np.tensordotnp.einsum

In [19]: np.tensordot(B, A, (-1, -1))
Out[19]: 
array([[[6, 7],
        [6, 8]],

       [[4, 5],
        [3, 4]]])

In [20]: np.einsum('ij,klj->kli', A, B)
Out[20]: 
array([[[6, 7],
        [6, 8]],

       [[4, 5],
        [3, 4]]])

这两个功能都可以计算产品总和。因此,他们是 矩阵乘法的推广。

注意阵列的形状通常很有帮助。如果我们制作ABresult NumPy数组:

A = np.array([[1,1,1],[2,1,1]])
B = np.array([[[1,2,3],[2,2,2]],[[1,1,2],[1,1,1]]])
result = np.array([[[6,7],[6,8]], [[4,5],[3,4]]])

然后

In [6]: A.shape
Out[6]: (2, 3)

In [7]: B.shape
Out[7]: (2, 2, 3)

In [9]: result.shape
Out[9]: (2, 2, 2)

请注意AB中长度为3的轴在result中消失。这表明(产品)的总和是在AB的最后一个轴上。

(-1, -1)中的np.tensordot(B, A, (-1, -1))告诉np.tensordotAB的最后一个轴进行求和。

同样,'ij,klj->kli'中的np.einsum('ij,klj->kli', A, B)表示如果A有索引ijB有索引{{1} }},kl,结果应该有索引jkl。请注意i索引消失。 j索引是jA中的最后一个索引。因此,B告诉'ij,klj->kli'总结np.einsumA的最后一个索引。

唯一要做的就是找出Bkl索引的正确顺序。由于i中的每个轴都具有相同的长度,因此result的形状不会给出任何线索。我通过反复试验找到了正确的订单。