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

如何用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 实现

方案思路

  1. 一次性读取所有数据,避免逐行读取的低效;
  2. 从数据中提取最大索引n,动态初始化数组;
  3. 遍历每一行数据,根据i和j直接赋值到对应位置;
  4. 支持从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 实现

方案思路

  1. 使用numpy高效读取并解析数值数据;
  2. 提取最大索引n,创建对应大小的全零数组;
  3. 利用数组索引的广播特性批量赋值,提升处理效率;
  4. 原生支持从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:04:52