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
相关产品推荐
相关产品推荐

