如何(惯用地)从分隔文本文件中读取索引数组?

问题描述 投票:0回答:1

我有来自外部源的文本文件,其格式如下:

       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

其中前两列是二维数组的索引(例如

i
j
),第三列和第四列是两个二维数组的值(例如
p[:,:]
q[:,:]
)。 Python/Julia 中将其读入两个二维数组的惯用方法是什么?

我们可以做出一些假设:数组是下三角的(即,值仅存在(或非零)

j <= i
),并且索引正在增加,也就是说,最后一行可以预期具有最大的
i
(可能还有
j
)。

当前的实现假设最大

i
j
为 40,并按如下方式进行:(Julia 最小工作示例):

using OffsetArrays
using DelimitedFiles: readdlm

n = 40

p = zeros(0:n, 0:n)
q = zeros(0:n, 0:n)

open(filename) do infile
    for i = 0:n
        for j = 0:i
            line = readline(infile)
            arr = readdlm(IOBuffer(line))
            p[i,j] = arr[3]
            q[i,j] = arr[4]
        end
    end
end

请注意,此示例还假设索引

j
变化最快,这通常是正确的,但这样做实际上会忽略数据的前两列。

但是,我正在寻找一种对数据文件做出更少假设的解决方案(可能只有下三角假设和索引递增假设)。在 Julia 或 Python 中执行此操作的“自然”方式是什么?

python arrays matrix file-io julia
1个回答
0
投票

类似于以下内容(Python)?

data = []
with open('demo.txt') as file:
    for line in file:
        tokens = line.split()
        if len(tokens) == 4:
            i = int(tokens[0])
            j = int(tokens[1])
            p = float(tokens[2])
            q = float(tokens[3])
            data.append((i, j, p, q))

print(data)
© www.soinside.com 2019 - 2024. All rights reserved.