【问题标题】:Read txt data separated by empty lines as several numpy arrays将空行分隔的 txt 数据读取为几个 numpy 数组
【发布时间】:2016-04-12 09:56:59
【问题描述】:

我在一个txt文件中有一些数据如下:

# Contour 0, label:       37
 41.6  7.5
 41.5  7.4 
 41.5  7.3 
 41.4  7.2 

# Contour 1, label: 
 48.3  2.9 
 48.4  3.0 
 48.6  3.1 

# Contour 2, label: 
 61.4  2.9 
 61.3  3.0 
....

所以每个块都以注释开始,以空行结束。 我想读出这些数据并将它们放入一个由 numpy 数组组成的列表中,就像

# list as i want it:
[array([[41.6, 7.5], [41.5, 7.4], [1.5, 7.3], [41.4, 7.2]]),
 array([[48.3, 2.9], [48.4, 3.0], [48.6, 3.1]]),
 array([[61.4, 2.9], [61.3, 3.0]]), ...]

numpy 有没有一种有效的方法来做到这一点? genfromtxtloadtxt 似乎没有所需的选项!?

【问题讨论】:

  • loadtxtgenfromtxt 并不是特别有效。他们只是逐行读取输入,执行split,然后收集列表中的值。 `转换是一个结束。对于简单的花车,您自己的阅读器也一样好。
  • 早期有关于按块读取 csv 的 SO 问题。读者接受任何来源的线路。编写您自己的过滤器或生成器。

标签: python arrays numpy


【解决方案1】:

您可以使用 Python 的 groupby 函数将 3 个条目组合在一起,如下所示:

from itertools import groupby
import numpy as np

array_list = []

with open('data.txt') as f_data:    
    for k, g in groupby(f_data, lambda x: x.startswith('#')):
        if not k:
            array_list.append(np.array([[float(x) for x in d.split()] for d in g if len(d.strip())]))

for entry in array_list:
    print entry
    print

这将显示array_list,如下所示:

[[ 41.6   7.5]
 [ 41.5   7.4]
 [ 41.5   7.3]
 [ 41.4   7.2]]

[[ 48.3   2.9]
 [ 48.4   3. ]
 [ 48.6   3.1]]

[[ 61.4   2.9]
 [ 61.3   3. ]]

【讨论】:

  • 我需要一段时间来了解它为什么以及如何工作。哇,谢谢!
【解决方案2】:

像这样?

import numpy as np

text = \
'''
# Contour 0, label:       37
 41.6  7.5
 41.5  7.4 
 41.5  7.3 
 41.4  7.2 

# Contour 1, label: 
 48.3  2.9 
 48.4  3.0 
 48.6  3.1 

# Contour 2, label: 
 61.4  2.9 
 61.3  3.0 
'''
for line in text.split('\n'):
    if line != '' and not line.startswith('#'):
        data = line.strip().split()
        array = np.array([float(d) for d in data])
        print(array)

【讨论】:

    猜你喜欢
    • 2021-01-28
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 2020-05-26
    相关资源
    最近更新 更多