如何用Python/Julia规范读取带索引的分隔文本文件为二维数组
读取下三角索引格式文件为二维数组(Julia/Python通用实现)
给定如下格式的文本文件,前两列为二维数组的索引i和j(满足j <= i,即数组为下三角结构,且索引按递增顺序排列,最后一行的i为数组的最大索引),第三、四列分别对应两个二维数组p[:,:]和q[:,:]的取值:
0 0 -0.105961 0.00000 1 0 -1.06965 0.00000 1 1 -0.0187213 -0.240237 2 0 -0.124695 0.00000 2 1 -0.178982 0.0633255 2 2 0.760988 -0.213796 3 0 -1.96695 0.00000 3 1 0.0721285 0.0491248 3 2 -0.560517 0.267733 3 3 -0.188732 -0.112053 4 0 -0.0205364 0.00000 ⋮ ⋮ ⋮ ⋮ 40 30 0.226833 -0.733674 40 31 0.0444837 -0.249677 40 32 -0.171559 -0.970601 40 33 -0.141848 -0.137257 40 34 -0.247042 -0.902128 40 35 -0.495114 0.322912 40 36 0.132215 0.0543294 40 37 0.125682 0.817945 40 38 0.181098 0.223309 40 39 0.702915 0.103991 40 40 1.11882 -0.488252
原有实现依赖预先知道最大索引n=40,且忽略了文件中的索引列,现在需要一种不依赖预先指定n、直接利用文件中索引信息的通用实现方案,仅保留“下三角结构、索引递增”的假设。
Julia 实现
方案思路
- 一次性读取所有数据,避免逐行读取的低效;
- 从数据中提取最大索引
n,动态初始化数组; - 遍历每一行数据,根据
i和j直接赋值到对应位置; - 支持从0开始的索引(使用
OffsetArrays),适配文件中的索引格式。
代码示例
using OffsetArrays using DelimitedFiles: readdlm function load_arrays(filename::String) # 读取所有数据并解析为数值矩阵 data = readdlm(filename) # 获取最大索引i(利用索引递增特性,取最后一行的i值) n = Int(data[end, 1]) # 初始化从0开始索引的全零数组 p = OffsetArray(zeros(n+1, n+1), 0:n, 0:n) q = OffsetArray(zeros(n+1, n+1), 0:n, 0:n) # 遍历每行数据,按索引赋值 for row in eachrow(data) i = Int(row[1]) j = Int(row[2]) p[i, j] = row[3] q[i, j] = row[4] end return p, q end # 使用示例 p, q = load_arrays("your_file.txt")
说明
- 如果索引从1开始,可移除
OffsetArrays,直接初始化zeros(n, n)即可; - 若索引不严格递增,可替换
n = Int(data[end, 1])为n = Int(maximum(data[:,1]))来获取最大索引。
Python 实现
方案思路
- 使用
numpy高效读取并解析数值数据; - 提取最大索引
n,创建对应大小的全零数组; - 利用数组索引的广播特性批量赋值,提升处理效率;
- 原生支持从0开始的索引,匹配文件格式。
代码示例
import numpy as np def load_arrays(filename): # 读取所有数据,自动跳过空白行 data = np.loadtxt(filename) # 获取最大索引i n = int(data[-1, 0]) # 初始化n+1 x n+1的全零数组 p = np.zeros((n+1, n+1), dtype=np.float64) q = np.zeros((n+1, n+1), dtype=np.float64) # 提取索引和对应值,批量赋值 i_indices = data[:, 0].astype(int) j_indices = data[:, 1].astype(int) p[i_indices, j_indices] = data[:, 2] q[i_indices, j_indices] = data[:, 3] return p, q # 使用示例 p, q = load_arrays("your_file.txt")
说明
- 若文件包含表头,可通过
np.loadtxt的skiprows参数跳过指定行数; - 批量赋值比逐行循环更高效,适合处理大数据量文件;
- 未赋值的上三角区域自动保持为0,符合下三角数组的特性。
内容的提问来源于stack exchange,提问作者rigel
相关产品推荐
相关产品推荐

