2d 矩阵的 Numpy 矩阵乘法得到 3d 矩阵
Numpy matrix multiplication of 2d matrix to give 3d matrix
我有两个 numpy 数组,比如
A: = array([[0, 1],
[2, 3],
[4, 5]])
B = array([[ 6, 7],
[ 8, 9],
[10, 11]])
对于A和B的每一行,分别说Ra和Rb,我想计算转置(Ra)*Rb。所以对于 A 和 B 的给定值,我想要以下答案:
array([[[ 0, 0],
[ 6, 7]],
[[ 16, 18],
[ 24, 27]],
[[ 40, 44],
[ 50, 55]]])
我为此编写了以下代码:
x = np.outer(np.transpose(A[0]), B[0])
for i in range(1,len(A)):
x = np.append(x,np.outer(np.transpose(A[i]), B[i]),axis=0)
有没有更好的方法来完成这个任务。
您可以将 A
和 B
的扩展维度与 np.newaxis/None
to bring in broadcasting
一起用于像这样的矢量化解决方案 -
A[...,None]*B[:,None,:]
解释: np.outer(np.transpose(A[i]), B[i])
基本上在 A[i]
和 [=17 的 columnar 版本之间进行元素乘法=].您正在针对 B
中的相应行对 A
中的所有行重复此操作。请注意 np.transpose()
似乎没有任何影响,因为 np.outer
负责预期的元素乘法。
我会用矢量化语言描述这些步骤,然后像这样实现 -
- 扩展
A
和 B
的尺寸,为它们形成 3D
形状,这样我们就可以保持 axis=0
对齐并保持 axis=0
在这两个扩展版本也是如此。因此,我们只剩下决定最后两个轴了。
- 为了引入元素乘法,将 A 的
axis=1
的原始二维版本推入其 3D
版本的 axis=1
,因此在 axis=2
处为 A
的扩展版本创建了一个单例维度。
3D
版本 A
的最后一个单例维度必须与 B
原始 2D
版本中 axis=1
的元素对齐才能让broadcasting
发生了。因此,B
的扩展版本会将其 2D 版本中 axis=1
中的元素推送到其 3D
版本中的 axis=2
,从而为 [=27 创建一个单例维度=].
最后,扩展版本将是:A[...,None]
& B[:,None,:]
,将 whom 相乘会给我们想要的输出。
我有两个 numpy 数组,比如
A: = array([[0, 1],
[2, 3],
[4, 5]])
B = array([[ 6, 7],
[ 8, 9],
[10, 11]])
对于A和B的每一行,分别说Ra和Rb,我想计算转置(Ra)*Rb。所以对于 A 和 B 的给定值,我想要以下答案:
array([[[ 0, 0],
[ 6, 7]],
[[ 16, 18],
[ 24, 27]],
[[ 40, 44],
[ 50, 55]]])
我为此编写了以下代码:
x = np.outer(np.transpose(A[0]), B[0])
for i in range(1,len(A)):
x = np.append(x,np.outer(np.transpose(A[i]), B[i]),axis=0)
有没有更好的方法来完成这个任务。
您可以将 A
和 B
的扩展维度与 np.newaxis/None
to bring in broadcasting
一起用于像这样的矢量化解决方案 -
A[...,None]*B[:,None,:]
解释: np.outer(np.transpose(A[i]), B[i])
基本上在 A[i]
和 [=17 的 columnar 版本之间进行元素乘法=].您正在针对 B
中的相应行对 A
中的所有行重复此操作。请注意 np.transpose()
似乎没有任何影响,因为 np.outer
负责预期的元素乘法。
我会用矢量化语言描述这些步骤,然后像这样实现 -
- 扩展
A
和B
的尺寸,为它们形成3D
形状,这样我们就可以保持axis=0
对齐并保持axis=0
在这两个扩展版本也是如此。因此,我们只剩下决定最后两个轴了。 - 为了引入元素乘法,将 A 的
axis=1
的原始二维版本推入其3D
版本的axis=1
,因此在axis=2
处为A
的扩展版本创建了一个单例维度。 3D
版本A
的最后一个单例维度必须与B
原始2D
版本中axis=1
的元素对齐才能让broadcasting
发生了。因此,B
的扩展版本会将其 2D 版本中axis=1
中的元素推送到其3D
版本中的axis=2
,从而为 [=27 创建一个单例维度=].
最后,扩展版本将是:A[...,None]
& B[:,None,:]
,将 whom 相乘会给我们想要的输出。