Python 将由空行分隔的txt数据读取为多个numpy数组
我在txt文件中有一些数据,如下所示:Python 将由空行分隔的txt数据读取为多个numpy数组,python,arrays,numpy,Python,Arrays,Numpy,我在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 .... from itertools import groupby import numpy a
# 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
....
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
因此,每个块都以注释开始,以空行结束。
我想读出这些数据并将它们放入一个由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做到这一点genfromtxt
或loadtxt
似乎没有必需的选项 像这样
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)
您可以使用Python的
groupby
函数将3个条目组合在一起,如下所示:
# 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
....
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
这将显示数组\u列表
,如下所示:
[[ 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. ]]
loadtxt
和genfromtxt
的效率并不特别高。他们只需逐行读取输入,进行拆分,然后在列表中收集值`转换是最终的结果。对于简单的浮动,您自己的阅读器也会很好。前面有关于按块读取csv的问题。读者接受任何来源的行。编写自己的过滤器或生成器。我需要一段时间来理解它的工作原理。哇,谢谢!