如何在numpy中对两个矩阵的每一列进行矩阵乘法?

0 投票
3 回答
72 浏览
提问于 2025-04-14 18:34

我有两个矩阵,

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]])

希望这能说明为什么一个清晰的、详细的例子,即使是用循环写的,也是很重要的。

撰写回答