如何通过无循环矩阵乘法计算区域供给对应的流入流出列表
无循环实现区域流入流出计算的numpy方案
直接用numpy的广播与掩码运算即可实现全向量化计算,完全不需要显式for循环,适配大矩阵场景:
核心逻辑
- 先通过广播运算生成全量转移矩阵,每个元素对应从起点区域到终点区域的实际转移供给量
- 用单位矩阵生成掩码,过滤掉起点、目的地为同一区域的自转移数据
- 按行求和得到各区域流出量,按列求和得到各区域流入量
完整实现代码
import numpy as np # 输入数据 Supply = np.array([10, 20]) OD_matrix = np.array([0.3,0.7,0.5,0.5]).reshape(2,2) # 生成全量OD转移矩阵(i行j列对应区域i到区域j的转移供给量) flow_matrix = Supply[:, np.newaxis] * OD_matrix # 生成自转移掩码:对角线为0,其余位置为1 mask = 1 - np.eye(OD_matrix.shape[0], dtype=OD_matrix.dtype) # 计算流出量:行求和,排除自转移 Out = (flow_matrix * mask).sum(axis=1) # 计算流入量:列求和,排除自转移 In = (flow_matrix * mask).sum(axis=0) # 更新后的供给量,和原有dot运算结果完全一致 Updated_Supply = flow_matrix.sum(axis=0)
输出验证
打印上述变量结果:
Supply [10, 20] In [10.0, 7.0] Out [7.0, 10.0] Updated Supply [13.0, 17.0]
和你给出的示例输出完全匹配。该方案基于numpy底层优化的向量化运算,即使是上万维度的大OD矩阵,也能在短时间内完成计算,性能远高于手动循环实现。
内容的提问来源于stack exchange,提问作者Yun Hyunsoo
相关产品推荐
相关产品推荐

