gpt4 book ai didi

python - 我怎样才能有效地用 python 加载这种 ASCII 文件?

转载 作者:太空宇宙 更新时间:2023-11-04 01:30:04 24 4
gpt4 key购买 nike

我有很大的 fortran 生成的 ASCII 文件,格式如下:

x y z  num_line index
1 float
2 float
...
num_line float
x2 y2 z2 num_line2 index2
1 float
2 float
...
num_line2 float
...

block 的数量可以达到数千个,每个 block 中的行数可以达到数百个。

让我们举一个我得到的例子:

0.0 0.0 0.0  4 0
1 0.5
2 0.9
3 0.4
4 0.1
0.0 0.0 1.0 4 1
1 0.2
2 0.2
3 0.4
4 0.9
0.0 1.0 2.0 5 2
1 0.7
2 0.6
3 0.9
4 0.2
5 0.7

我想从中得到什么(作为一个 numpy 矩阵):

0.5 0.2 0.7
0.9 0.2 0.6
0.4 0.4 0.9
0.1 0.9 0.2
nan nan 0.7

当然,我可以使用:

my_mat = []
with open("myfile", "r") as f_in:
niter = int(f_in.readline().split()[3])
while niter:
curr_vect = zeros(niter)
for i in xrange(niter):
curr_vect[i] = float(f_in.readline().split()[1])
my_mat.append(curr_vect)
line = f_in.readline()
if line is not None:
niter = int(line.split()[3])
else:
niter = False
my_mat = array(my_mat)

问题是这不是很有效,而且相对于它的实际情况来说太复杂了。我已经知道 numpy 的 loadtxtgenfromtxt 但它们似乎并不适用。

我正在寻找更快、更易读的东西。有什么想法吗?

编辑:

请原谅我,我的问题不完整,你们中的一些人因为我而浪费了时间。这是此类 block 的真实示例:

3.571428571429E-02 3.571428571429E-02-3.571428571429E-02         1   35  
1 -0.493775207966779
2 0.370269037864060
3 0.382332033744703
4 0.382332033744703
5 0.575515346181205
6 0.575515346181216
7 0.575562530624028
8 0.639458035564442
9 0.948445367602052
10 0.948445367602052
11 0.975303238888803
12 1.20634795229899
13 1.21972845646758
14 1.21972845646759
15 1.52659950368213
16 2.07381346028515
17 2.07629743909555
18 2.07629743909555
19 2.15941179949552
20 2.15941179949552
21 2.30814240005132
22 2.30814240005133
23 2.31322868361483
24 2.53625115348660
25 2.55301153157825
26 2.55301153157826
27 2.97152031842301
28 2.98866790318661
29 2.98866790318662
30 3.24757159459268
31 3.27186643004142
32 3.27186643004143
33 3.37632477135298
34 3.37632477135299
35 3.55393884607834

最佳答案

你可以使用 numpy.genfromtxt:

  1. 阅读列,由换行符 \n
  2. 分隔
  3. 提供自定义转换器函数

例子:

import numpy as np
from StringIO import StringIO

# your data from above as string
raw = '''0.0 0.0 0.0 4 0
1 0.5
...
5 0.7
'''

这是转换器:

def custom_converter(line):
token = line.split()
if len(token) == 2:
return float(token[1])
else:
return np.NaN

加载数据:

data = np.genfromtxt(StringIO(raw),
delimiter='\n',
converters={0: custom_converter})

print data

打印:

[ nan  0.5  0.9  0.4  0.1  nan  0.2  0.2  0.4  0.9  nan  0.7  0.6  0.9  0.2
0.7]

现在你建立了最终的数据结构:

delims, = np.where(np.isnan(data))
max_block = np.max(np.diff(delims))
nblocks = delims.size
final_data = np.empty([max_block, nblocks]) + np.NaN

delims = delims.tolist()
delims.append(data.size)
low = delims[0] + 1
for i, up in enumerate(delims[1:]):
final_data[0: up-low , i] = data[low:up]
low = up + 1

print final_data

打印

[[ 0.5  0.2  0.7]
[ 0.9 0.2 0.6]
[ 0.4 0.4 0.9]
[ 0.1 0.9 0.2]
[ nan nan 0.7]]

关于python - 我怎样才能有效地用 python 加载这种 ASCII 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14396362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com