You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 19:57:54