gpt4 book ai didi

numpy - 使用 NumPy 读取大格式文本文件

转载 作者:行者123 更新时间:2023-12-04 15:24:23 30 4
gpt4 key购买 nike

我自愿帮助某人将有限元网格从一种格式转换为另一种格式(i-deas *.unv 到 Alberta)。我已经使用 NumPy 对网格进行了一些额外的整形,但是我在将原始文本文件数据读入 NumPy 数组时遇到了问题。到目前为止,我已经尝试过 genfromtxt 和 loadtxt 没有成功。

一些细节:

1) 所有组都由页眉和页脚标志“-1”在其自己的行上分隔。

2) NODE 组在它自己的行上有一个标题“2411”。我只想从该组中读取备用行,用 4 个整数跳过每一行,但读取带有 3 个 Fortran double 数字的行。

3) ELEMENT 连接组在其自己的线路上有一个报头“2412”。所有数据都是整数,只需要读取前 4 列。由于缺少 2 和 3 个节点元素的值,NumPy 数组中将有一些空槽。

4)“2477”节点组我想我可以使用正则表达式来处理自己,找到要读取的行。

5) 真实的数据文件将有大约 100 万行文本,所以如果可能的话,我非常希望它被矢量化(或者任何 NumPy 可以快速读取内容)。

对不起,如果我提供了太多信息,谢谢。

下面几行是 *.unv 文本文件格式的部分示例。

    -1
2411
146303 1 1 11
6.9849462399269246D-001 8.0008842847097805D-002 6.6360238055630028D-001
146304 1 1 11
4.1854795755893875D-001 9.1256034628308313D-001 3.5725496189239300D-002
146305 1 1 11
7.5541258490349616D-001 3.7870257739063029D-001 2.0504544370783115D-001
146306 1 1 11
2.7637569971086767D-001 9.2829777518336010D-001 1.3757239038663285D-001
-1
-1
2412
9 21 1 0 7 2
0 0 0
1 9
10 21 1 0 7 2
0 0 0
9 10
1550 91 6 0 7 3
761 3685 2027
1551 91 6 0 7 3
761 2380 2067
39720 111 1 0 7 4
71854 59536 40323 73014
39721 111 1 0 7 4
45520 48908 133818 145014
-1
-1
2477
1 0 0 0 0 0 0 3022
PERMANENT GROUP1
7 2 0 0 7 3 0 0
7 8 0 0 7 7 0 0
7 147 0 0 7 148 0 0
2 0 0 0 0 0 0 2915
PERMANENT GROUP2
7 1 0 0 7 5 0 0
7 4 0 0 7 6 0 0
7 9 0 0 7 11 0 0
-1

最佳答案

numpy 方法 genfromtxtloadtxt将很难应用于整个文件,因为您的数据具有非常特殊的结构(根据您所在的节点而变化)。因此,我建议采用以下策略:

  • 逐行读取文件,尝试通过分析该行来确定您在哪个节点。
  • 如果您在一个只有少量数据的节点中(例如,您必须读取交替的行,因此无法连续读取),请逐行读取并处理这些行。
  • 当您到达包含大量数据的部分(例如具有“真实数据”的部分)时,使用 numpys fromfile 方法读取数据,如下所示:
    mydata = np.fromfile(fp, sep=" ", dtype=int, count=number_of_elements)
    mydata.shape = (100000, 3) # Reshape it to the desired shape as fromfile
    # returns a 1D array.

  • 通过这种方式,您可以将逐行处理的灵活性与快速读取和转换大量数据的能力结合起来。

    更新:关键是,你打开文件,一行一行地读取它,当你到达一个有大量数据的地方时,你将文件描述符传递给 fromfile。

    下面是一个简化的例子:
    import numpy as np

    fp = open("test.dat", "r")
    line = fp.readline()
    ndata = int(line.strip())
    data = np.fromfile(fp, count=ndata, sep=" ", dtype=int)
    fp.close()

    这将从文件 test.dat 中读取数据内容如下:
    10
    1 2 3 4 5
    6 7 8 9 10

    第一行用 fp.read() 显式读取, 处理(确定要读取的整数个数)然后 np.fromfile()读取适当的数据块并将其存储在一维数组中 data .

    UPDATE2:或者,您可以将整个文本读入缓冲区,然后确定大数据块的开始和结束位置,并通过 np.fromstring 进行转换。直接地:
    fp = open("test.dat", "r")
    txt = fp.read()
    fp.close()
    # Now determine starting and end positions (startpos, endpos)
    # ..
    # pass text that portion of the text to the fromstring function.
    data = np.fromstring(txt[startpos:endpos], dtype=int, sep=" ")

    或者,如果很容易将其表述为一个正则表达式,您可以使用 fromregex()直接上文件。

    关于numpy - 使用 NumPy 读取大格式文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14946665/

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