我有来自外部源的文本文件,其格式如下:
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)?
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)