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

Python将OD矩阵原始文本转换为数组的问题 附代码及文本样例

原有代码存在的问题
  • re.split参数使用错误:pattern参数不支持传入列表,需传入正则表达式字符串,匹配:和;应写为r'[:;]';同时string参数错误传入了整个行列表lines,应传入当前遍历的单行文本line。
  • 未提取Origin行的起始点索引:Origin后跟随的数字是OD矩阵的行号(起点编号),原代码直接跳过该行未存储该索引,无法确定后续OD值对应的写入位置,且未处理Origin行前可能存在的#注释符。
  • 未处理文本中的脏字符:示例文本中存在###200.0这类带特殊符号的数值,未清洗无法直接转换为浮点数。
  • 未对分割后的内容做清洗:分割后的字符串会携带多余空格、空值,未处理无法直接转换为数值。
  • 缺少将解析后的数值写入OD矩阵的逻辑,仅存储分割结果无法得到最终矩阵。
修正后的可运行代码
import numpy as np
import re

def read_process_OD():
    # 初始化24*24的OD矩阵
    OD = np.zeros([24, 24])
    current_origin = None  # 存储当前处理的起点编号(0索引)
    with open('Network_OD.txt', 'r', encoding='utf-8') as f:
        lines = f.readlines()
    
    for line in lines:
        # 清洗行首空格、#注释符,去掉首尾空白
        line = line.lstrip('# ').strip()
        if not line:
            continue  # 跳过空行
        
        # 匹配Origin行,提取起点编号
        if line.startswith('Origin'):
            origin_num = re.search(r'Origin\s+(\d+)', line).group(1)
            current_origin = int(origin_num) - 1  # 转为0索引适配矩阵
            continue
        
        # 处理OD数值行
        if current_origin is not None:
            # 按:或;分割行内容
            parts = re.split(r'[:;]', line)
            # 清洗分割结果,去除空值和多余空格
            parts = [p.strip() for p in parts if p.strip()]
            # 每两个元素为一组:[终点编号, OD值]
            for i in range(0, len(parts), 2):
                dest_num = int(parts[i]) - 1  # 终点转为0索引
                # 移除数值中的特殊字符(如###)
                val_str = re.sub(r'[^\d.]', '', parts[i+1])
                od_val = float(val_str)
                # 写入OD矩阵
                OD[current_origin][dest_num] = od_val
    return OD

# 调用示例
if __name__ == '__main__':
    od_matrix = read_process_OD()
    print(od_matrix)
注意事项
  • 代码默认OD的起点、终点编号范围为1~24,若实际编号规则不同可调整索引转换逻辑
  • 若存在其他格式的脏字符,可修改re.sub(r'[^\d.]', '', parts[i+1])中的正则规则适配

内容的提问来源于stack exchange,提问作者Paloma Fernandez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:24:07