我正在分析一堆带有时间戳的数据。我创建了一个类,其中包含一个数据点,以及与该数据点关联的数据(此处仅显示了几个其他值,但这可能是更大的元数据集合(数字和文本):
class SpectrumDataPoint(object):
def __init__(self, timestamp, num_average, frame_time):
self.timestamp = timestamp
self. num_average = num_average
self.frame_time = frame_time
然后,将这些点添加到循环内的列表中(未显示):
point = SpectrumDataPoint(datetime.datetime.now(), var1, var2)
spec.append(point)
我现在想做的是根据时间戳绘制数据以查找趋势。例如,我可能想针对timestamp
绘制num_average
。
是否可以通过这种方式绘制数据,而不必遍历列表以在内存中创建数据的新副本?如果是这样,怎么办?
我希望像spec[1:10].num_average
这样的东西可以工作。
答案 0 :(得分:0)
matplotlib
处理时间戳,因此您只需要提取值对。
t = []
vals = []
for spec in specs:
t.append(spec.timestamp)
vals.append(spec.num_average)
然后将其绘制
plt.plot(t, vals)
plt.show()
没有像spec[1:10].num_average
这样的语法。最接近的是列表理解[s.num_average for s in spec[1:10]]
。但是,即使它存在,它仍然会在后台进行迭代。 matplotlib将需要数组(连续的内存位置),并且您的值属于不同的对象。
但是,即使对于数百万个点,迭代时间也可以忽略不计。真正的瓶颈将是绘图本身,而实际上每次绘制成千上万个点时就会崩溃。