将两个二维numpy数组相乘得到一个三维数组

4
我有两个2D的 numpy 数组,名为 A 和 B,其中 A 是 M x N 的,B 是 M x n 的。我的问题是我想要将 B 的每一行的每个元素与对应的 A 的行相乘,并创建一个大小为 M x n x N 的 3D 矩阵 C,而不使用 for 循环。
例如,如果 A 是:
A = np.array([[1, 2, 3],
              [4, 5, 6]])

并且B

B = np.array([[1, 2],
              [3, 4]])

那么得出的乘法结果C = A x B大概是这样的:

C = [
     [[1, 2],
      [12, 16]],
     [[2, 4],
      [15, 20]],
     [[3, 6],
      [18, 24]]
     ]

你明白我试图实现什么,而且是否可能在没有任何for循环的情况下完成?最好,tingis。

2个回答

6
你可以使用NumPy的Einstein求和函数einsum()
C=np.einsum('ij,ik->jik',A,B)

1
谢谢您的快速回答!这个函数非常有帮助,我会采用您的解决方案! - Tingiskhan
einsum 可以做出奇妙的事情,我认为它也比其他 numpy 向量乘积方法更快。此外,在 -> 之后改变索引顺序,您可以进行重新整形而无需额外调用实际的 reshape - yevgeniy
2
@yevgeniy 关于更快的问题,这取决于数组的大小。通常较小的数组更快,而对于较大的数组,我测量的速度与使用 newaxis 方法相当。 - Saullo G. P. Castro
2
@SaulloCastro。感谢您进行了实际测试。我也在关注这个链接(https://dev59.com/Wo7da4cB1Zd3GeqP-To3),其中`einsum`表现非常出色,所以在数组大小> 10000时,应考虑其他解决方案。 - yevgeniy

4

可以通过在每个数组中创建一个新轴并转置修改后的A来实现:

A[np.newaxis,...].T * B[np.newaxis,...]

给予:
array([[[ 1,  2],
        [12, 16]],

       [[ 2,  4],
        [15, 20]],

       [[ 3,  6],
        [18, 24]]])

3
哇,感谢您的快速回答!我会选择yev的答案,因为他需要这些积分;D - Tingiskhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接