如何在numpy中对两个矩阵的每一列进行矩阵乘法?
我有两个矩阵,
A = np.array([[1, 3, 5],
[2, 4, 6]])
b = np.array([[7, 9, 11],
[8, 10, 12]])
我想要进行的操作是相乘
# Column 1
A_1 = np.matmul([[1],[2]], [[7, 8]])
# [1]
# [2] * [7, 8] = [7, 8]
# [14, 16]
# Column 2
A_2 = np.matmul([[3],[4]], [[9, 10]])
# [3]
# [4] * [9, 10] = [27, 30]
# [36, 40]
# A_1+A_2 = [34 38
# 50 56]
....
# Column N
然后对每一列的结果进行求和。我的矩阵形状总是 (2, N)。简单来说,就是把矩阵 A 的第 i 列和矩阵 B 的第 i 列的转置相乘,然后把每一对列得到的 2x2 矩阵相加。
我知道我可以通过循环每个元素来计算,但我觉得这不是使用 numpy 的真正意义,应该有更好的方法。
3 个回答
1
如果我理解正确的话,你可以使用 np.einsum
来实现这个功能:
A = np.array([[1, 3, 5], [2, 4, 6]])
B = np.array([[7, 9, 11], [8, 10, 12]])
out = np.einsum("ij,kj->ik", A, B)
print(out)
输出结果是:
[[ 89 98]
[116 128]]
补充说明:正如 @NickODell 所说,如果你想把每一列的 2x2 矩阵相加成一个数字,可以使用:
out = np.einsum("ij,kj->j", A, B)
print(out)
输出结果是:
[ 45 133 253]
2
这不就是 A @ b.T
吗?
2
In [74]: np.dot(A,b.T)
Out[74]:
array([[ 89, 98],
[116, 128]])
这里有一些建议的答案,不过有点让人困惑:
In [62]: A = np.array([[1, 3, 5],
...: [2, 4, 6]])
...: b = np.array([[7, 9, 11],
...: [8, 10, 12]])
你部分的计算:
In [63]: A@b.T
Out[63]:
array([[ 89, 98],
[116, 128]])
In [64]: np.einsum('ij,kj->ik',A,b)
Out[64]:
array([[ 89, 98],
[116, 128]])
In [65]: np.einsum('ij,kj->j',A,b)
Out[65]: array([ 45, 133, 253])
把其中两个加起来:
In [70]: [A[:,[i]]*b[:,[i]].T for i in range(3)]
Out[70]:
[array([[ 7, 8],
[14, 16]]),
array([[27, 30],
[36, 40]]),
array([[55, 60],
[66, 72]])]
把所有三个加起来:
In [72]: sum([A[:,[i]]*b[:,[i]].T for i in range(2)])
Out[72]:
array([[34, 38],
[50, 56]])
等等,我在哪里见过这些数字呢?
因为这两个都是二维数组,我们可以用老办法 np.dot
来处理。
In [73]: sum([A[:,[i]]*b[:,[i]].T for i in range(3)])
Out[73]:
array([[ 89, 98],
[116, 128]])
希望这能说明为什么一个清晰的、详细的例子,即使是用循环写的,也是很重要的。