基于Numpy实现两组N×N矩阵所有配对的高效乘法及扩展需求
嘿,这个需求用Numpy的广播特性就能轻松搞定,完全不用写嵌套循环,效率还拉满!我来分两个问题给你拆解:
问题1:无循环高效实现所有矩阵配对乘积
核心思路是利用Numpy广播来自动扩展维度,让两组矩阵能逐个配对相乘。具体步骤如下:
- 给
L1增加一个维度,从(M1, N, N)变成(M1, 1, N, N)——这样是为了让它能和L2的M2个矩阵逐个配对; - 给
L2增加一个维度,从(M2, N, N)变成(1, M2, N, N); - 用
np.matmul()或者@运算符做矩阵乘法,这时候广播会自动把两个数组扩展成(M1, M2, N, N)的形状,每个位置就是对应的L1[i]·L2[j]; - 最后用
reshape()把结果拉成(M1*M2, N, N)的形状就搞定了。
直接上代码:
import numpy as np N = 2 M1 = 3 M2 = 2 L1 = np.random.randn(M1, N, N) L2 = np.random.randn(M2, N, N) # 实现无循环的矩阵配对乘积 product_pairs = np.matmul(L1[:, np.newaxis, :, :], L2[np.newaxis, :, :, :]) # 或者更简洁的写法:product_pairs = L1[:, None] @ L2[None, :] result = product_pairs.reshape(M1*M2, N, N) # 可以用循环验证结果是否正确(只是验证用,实际不用写) loop_result = [] for a in L1: for b in L2: loop_result.append(a @ b) loop_result = np.array(loop_result) print(np.allclose(result, loop_result)) # 输出True,说明结果一致
问题2:扩展功能,给每个乘积结果加入固定矩阵X
这个更简单!因为X是(N,N)的矩阵,Numpy的广播会自动把它扩展成和乘积结果一样的(M1, M2, N, N)形状,直接相加就行,最后再reshape:
X = np.random.randn(N, N) # 乘积加X的结果 product_plus_X = (L1[:, None] @ L2[None, :]) + X final_result = product_plus_X.reshape(M1*M2, N, N) # 同样验证一下 loop_final = [] for a in L1: for b in L2: loop_final.append(a @ b + X) loop_final = np.array(loop_final) print(np.allclose(final_result, loop_final)) # 输出True
这里要注意:[:, None]和[:, np.newaxis]是完全等价的,只是写法更简洁,你可以随便用哪个。这种方法完全利用了Numpy的底层优化,比手写循环快得多,尤其是当M1、M2很大的时候优势特别明显。
内容的提问来源于stack exchange,提问作者almagy
相关产品推荐
相关产品推荐

