我有两个numpy数组:A形状(b,i)和B形状(b,o).我想计算的阵列- [R形状(B,I,O),其中每一行的升的ř包含行的外积升的甲和行升的乙.到目前为止我所拥有的是:
import numpy as np
A = np.ones((10, 2))
B = np.ones((10, 6))
R = np.asarray([np.outer(a, b) for a, b in zip(A, B)])
assert R.shape == (10, 2, 6)
Run Code Online (Sandbox Code Playgroud)
我认为这个方法太慢了,因为zip和最终转换成numpy数组.
有更有效的方法吗?
这是可能的numpy.matmul,这可以做"矩阵堆栈"的倍增.在这种情况下,我们希望将一堆列向量与一堆行向量相乘.首先将矩阵A带到形状(b,i,1),将B带到形状(b,1,o).然后使用matmul执行b次外部产品:
import numpy as np
i, b, o = 3, 4, 5
A = np.ones((b, i))
B = np.ones((b, o))
print(np.matmul(A[:, :, np.newaxis], B[:, np.newaxis, :]).shape) # (4, 3, 5)
Run Code Online (Sandbox Code Playgroud)
可以使用替代方法numpy.einsum,它可以直接表示您的索引表示法:
np.einsum('bi,bo->bio', A, B)
Run Code Online (Sandbox Code Playgroud)
为什么不简单
A[:, :, None] * B[:, None, :]
Run Code Online (Sandbox Code Playgroud)
根据你的约定和你的 dtype,你可能需要在另一个np.conj地方扔进去。请注意,这np.newaxis只是None
| 归档时间: |
|
| 查看次数: |
1477 次 |
| 最近记录: |