我想要进行下面的计算。本例中使用的值在实际情况中是可变的。
{{1}}
他们的任何有效方式是否满足上述计算numpy。 事实上,我并不清楚如何应用多维数组的numpy。因此,如果你知道有用的文档来理解操作多维数组规则,如果你让我知道,我很高兴。
答案 0 :(得分:3)
您可以使用np.tensordot
或np.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]]])
这两个功能都可以计算产品总和。因此,他们是 矩阵乘法的推广。
注意阵列的形状通常很有帮助。如果我们制作A
,B
和result
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)
请注意A
和B
中长度为3的轴在result
中消失。这表明(产品)的总和是在A
和B
的最后一个轴上。
(-1, -1)
中的np.tensordot(B, A, (-1, -1))
告诉np.tensordot
对A
和B
的最后一个轴进行求和。
同样,'ij,klj->kli'
中的np.einsum('ij,klj->kli', A, B)
表示如果A
有索引i
和j
且B
有索引{{1} }},k
和l
,结果应该有索引j
,k
,l
。请注意i
索引消失。 j
索引是j
和A
中的最后一个索引。因此,B
告诉'ij,klj->kli'
总结np.einsum
和A
的最后一个索引。
唯一要做的就是找出B
,k
和l
索引的正确顺序。由于i
中的每个轴都具有相同的长度,因此result
的形状不会给出任何线索。我通过反复试验找到了正确的订单。