我有一个文本文件,由组成单个列的数字组成,如下所示:
0
0
23
23
52433
0
我正在尝试将数据读入数组,然后对其进行绘图,我有以下脚本:
with open('r12c_24hr cement 1-11.TKA') as f:
import numpy as np
import matplotlib.pyplot as plt
e = zip(*(map(float, line.split()) for line in f))
count = 0
bins = []
while count < 8192:
bins.append(count)
count += 1
print len(bins)
print len(e)
当我尝试绘制e vs bin时,我得到的错误是它们的长度不同。当我打印长度时,bin为8192(正确长度),e为长度1.当我打印e和bin时,它们具有所有值。垃圾箱格式化
[0,1,2]
但是e格式化了
[(0,1,2)]
我怀疑这是错误所在,但无法弄清楚如何正确导入文本文件中的值。
答案 0 :(得分:3)
设置e
的问题在于,首先创建一个浮点数列表*(map(float, line.split()) for line in f)
,其值作为位置参数传递给zip
。将iterables作为位置参数,zip
在调用(iter1[0], iter2[0], ..., iterN[0]), (iter1[1], iter2[1], ..., iterN[1]), ...
时创建zip(iter1, iter2, ..., iterN)
的可迭代。因此,在您的情况下,您正在创建一个列表,其唯一的元素是数字列表 - 双嵌套。
简单e = map(float, f)
就足够了。 map
接受一个函数,一个iterable来接受函数。由于文件f
是一个可迭代的,在迭代时产生线并且你的线由一个数字组成,你可以直接传递它。
答案 1 :(得分:1)
每一行都将作为一个字符串读入,最后一行换行(除了可能是最后一行)。 float()
函数(实际上是一个类型)忽略了无关的空格,所以你可以尝试像
e = [float(s) for s in f.readlines()]
你的循环中的。但是,您的代码似乎确实假设文件中有8,192个数据值。您可能希望改为使用
bins = list(range(len(e))
总是会给你相同数量的箱子和e值。