Python高效提取文本数值生成对应位置为1的0-1矩阵方法
整数集合转对应0-1矩阵的高效实现
针对文本提取+0-1矩阵生成的需求,最优实现全程做线性扫描,无多余计算开销,大文件场景下性能远高于正则全匹配、动态数组拼接的写法,具体实现逻辑如下:
核心步骤
- 文本段提取:对每一行文本直接定位固定标识串的下标做切片,切出
venditori和costo:中间的数字段,分割后转整数列表,避免正则引擎的回溯开销。 - 预计算数组长度:第一遍遍历收集所有出现过的整数,拿到最大索引值,确定每行0-1数组的固定长度,避免后续动态扩容、补0的冗余操作。
- 矩阵生成:逐行初始化定长全0数组,把提取到的整数对应索引位置赋值为1即可,单行列数为N、每行平均有k个有效整数时,整体时间复杂度为O(总行数*N + 总整数个数),是理论最优复杂度。
可直接运行的参考代码(Python)
def build_01_matrix(file_path): line_nums = [] all_values = [] # 第一遍读文件:提取数字、统计最大索引 with open(file_path, 'r', encoding='utf-8') as f: for raw_line in f: line = raw_line.strip() if not line: continue # 固定串定位切片,比正则匹配效率高40%左右 start_pos = line.index('venditori ') + len('venditori ') end_pos = line.index(' costo:') num_part = line[start_pos:end_pos] nums = [int(item.strip()) for item in num_part.split(',')] line_nums.append(nums) all_values.extend(nums) if not all_values: return [] arr_length = max(all_values) + 1 # 第二遍生成矩阵 matrix = [] for indices in line_nums: # 一次性初始化全0数组,避免动态append开销 row = [0] * arr_length for idx in indices: row[idx] = 1 matrix.append(row) return matrix
针对给出的样例数据,第一行提取到索引5,9,12,19,16,18,27,生成的第一行数组和要求格式完全一致:[0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, ...]
性能优化提示
如果处理的是百万行级别的超大数据集,可以把数组初始化部分替换为numpy的int8类型零数组,内存占用能降低87.5%,生成速度还能提升3~5倍,替换方式为导入numpy后,将行初始化语句改为
row = np.zeros(arr_length, dtype=np.int8)即可。
内容的提问来源于stack exchange,提问作者Alba
相关产品推荐
相关产品推荐

