Shw*_*eta 3 python numpy matrix-multiplication
我有两个 numpy 数组,比如
A: = array([[0, 1],
[2, 3],
[4, 5]])
B = array([[ 6, 7],
[ 8, 9],
[10, 11]])
Run Code Online (Sandbox Code Playgroud)
对于 A 和 B 的每一行,分别表示 Ra 和 Rb,我想计算转置(Ra)*Rb。因此,对于给定的 A 和 B 值,我想要以下答案:
array([[[ 0, 0],
[ 6, 7]],
[[ 16, 18],
[ 24, 27]],
[[ 40, 44],
[ 50, 55]]])
Run Code Online (Sandbox Code Playgroud)
我编写了以下代码来执行此操作:
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)
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来完成这项任务。
您可以使用A
和B
with的扩展维度np.newaxis/None
来引入broadcasting
矢量化解决方案,如下所示 -
A[...,None]*B[:,None,:]
Run Code Online (Sandbox Code Playgroud)
解释: 基本上在和的柱状版本np.outer(np.transpose(A[i]), B[i])
之间进行元素乘法。您将针对 中的相应行对 中的所有行重复此操作。请注意,这似乎没有产生任何影响A[i]
B[i]
A
B
np.transpose()
np.outer
它会处理预期的元素乘法。
我会用矢量化语言描述这些步骤,从而实现,就像这样 -
A
和的尺寸B
以形成3D
它们两个的形状,以便我们保持axis=0
对齐并保持axis=0
在这两个扩展版本中。因此,我们需要决定最后两个轴。axis=1
A 的原始 2D 版本推入axis=1
其版本,从而为扩展版本的 A3D
创建一个单维axis=2
A
。3D
版本的最后一个单例维度A
必须与axis=1
原始2D
版本的元素对齐B
才能broadcasting
发生。因此, 的扩展版本B
会将其 2D 版本中的元素axis=1
推送到axis=2
其3D
版本中,从而为 创建单例维度axis=1
。最后,扩展版本将是 : A[...,None]
& B[:,None,:]
,将其相乘即可得到所需的输出。
归档时间: |
|
查看次数: |
1464 次 |
最近记录: |