Numpy - 两个矩阵的行外积

时间:2018-01-29 10:05:35

标签: python-2.7 numpy

我有两个numpy数组:形状(b,i)的 A 和形状(b,o)的 B 。我想计算一个形状(b,i,o)的数组 R R 的每一行 l 都包含 A 的行 l B 的行 l 。到目前为止我所拥有的是:

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)

我认为这个方法太慢了,因为zip和最终转换成numpy数组。

有更有效的方法吗?

2 个答案:

答案 0 :(得分:6)

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)

另一种方法是使用numpy.einsum,它可以直接代表您的索引符号:

np.einsum('bi,bo->bio', A, B)

答案 1 :(得分:2)

为什么不简单

A[:, :, None] * B[:, None, :]

根据您的约定和您的dtype,您可能需要在某处投入另一个np.conj。请注意,np.newaxis只是None