gpt4 book ai didi

python - 如何使用 numpy 读取文件的不同部分或 block

转载 作者:太空宇宙 更新时间:2023-11-04 03:18:45 25 4
gpt4 key购买 nike

我有一个由数据“ block ”组成的文件,其中标题说明文件中有多少 block 以及每个 block 中有多少行。

# mydata.dat
3 12343 2
# comment
12343
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
12343
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
12343
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8

我想分别存储每个 block 。我所做的是通过分割线从每个 block 生成一个列表,然后将其转换为数组以存储在字典中。

import numpy as np

with open('mydata.dat', "r") as f:
lines = f. readlines()
blocks, _, n = map(int, lines[1].split())
del lines[:3]
data = {i: np.array(dtype=float,
object=[line.split()
for line in lines[i * n + 1: n * (i + 1)]])
for i in xrange(blocks)}

我觉得应该有一种更好(更“高效”)的方式来直接解析文本 block 中的数据,例如 np.loadtxt ,您可以在其中跳过一定数量的行(例如切片),而不仅仅是从文件的开头开始。

最佳答案

loadtxt 做你为每个 block 所做的事情 - 读取每一行,拆分它,根据 dtype 转换它并将它附加到列表中,最后将其转换为一个数组。

在其他问题中已经指出,您可以将打开的文件或任何可迭代对象传递给 loadtxt。因此,您可以预处理文件,将其分成 block 、跳过行等。但总的来说,它不会比您正在做的更“高效”。

所以这可能有效(我还没有测试过):

data = {i: np.loadtxt(lines[i * n + 1: n * (i + 1)], dtype=float)
for i in xrange(blocks)}

它更紧凑,但我怀疑它是否更快。

我能想到的唯一其他方法是去除所有 block 大小行,将剩余的行传递给 loadtxt 以获取所有数据的数组,然后将其拆分为 block ,例如使用 np.split(...)

使用 txt 作为示例中的行列表:

In [396]: timeit np.array([line.split() for line in txt[4:6]],dtype=float)
100000 loops, best of 3: 13 µs per loop
In [397]: timeit np.loadtxt(txt[4:6],dtype=float)
10000 loops, best of 3: 71.4 µs per loop

关于python - 如何使用 numpy 读取文件的不同部分或 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35368956/

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