我正在编写一个程序,其中所有数据都放在一个大文件中,我需要将它分成几个部分,然后单独处理这些部分。数据分为3个部分,即拍摄当天(或“时代”),波长和光通量。我目前有:
epoch=[]
wavelength=[]
flux=[]
text_file = open("data.dat", "r")
lines1 = text_file.read()
#print lines1
text_file.close()
a = [float(x) for x in lines1.split()]
a1=0
a2=1
a3=2
while a1<len(a):
epoch.append(int(a[a1]))
wavelength.append(float(a[a2]))
flux.append(float(a[a3]))
a1+=3
a2+=3
a3+=3
print epoch
x=[]
y=[]
z=[]
for i in epoch:
if epoch[i] == epoch[i+1]:
x.append(epoch[i])
y.append(wavelength[i])
z.append(flux[i])
i+=1
#print x, y, z
#else integrate, i+=1
集成是我已经准备好的功能。
当我运行此结果时,结果是3个不同测量数据的最终值的3个列表,例如[1000,1000,1000,1000]而不是[970,980,990,1000]。我想告诉它,如果纪元的值不同,那么在具有相同纪元值的值范围内进行积分,然后再次为下一个纪元值开始处理。
我认为问题在于我没有正确指定列表中的位置,但我不确定如何修复它。
提前致谢。
答案 0 :(得分:0)
在底部for循环中,您将迭代epoch的值而不是这些值的索引。你可以放一个&#39; print(i)&#39;循环中的语句可以自己查看。这是适当迭代索引的代码:
for i in xrange(len(x)):
if (i + 1) < len(x) and epoch[i] == epoch[i+1]:
...
我修复了另一个错误,在循环的最后一次迭代中,您尝试访问超出列表末尾的索引。这段代码可能还有其他问题 - 这只是第一次通过。
答案 1 :(得分:0)
首先读取数据并列出三元组(时期,波长,通量)。 然后将数据与相同的纪元一起分组。 然后做你想做的事。
import itertools
with open("data.dat", "r") as text_file:
data = text_file.read()
data = zip(*[(float(z) for z in data)]*3)
for epoch, group in itertools.groupby(data, lambda x:x[0]):
group = list(group)
print group
答案 2 :(得分:0)
根据你的描述,听起来你想要一个时代字典,每个条目都包含一个波长/通量值列表。
from collections import defaultdict
data = defaultdict(list)
with open('data.dat') as stream:
for line in stream:
entry = line.split()
data[int(entry[0])].append((float(entry[1]), float(entry[2])))
for epoch, values in data.items():
y, z = list(zip(*values))
print('epoch:', epoch)
print(' wavelength:', y)
print(' flux:', z)