在大量数据点和较长的时间段上运行过滤器



我需要对大量数据应用两个正在运行的过滤器。我已经读到,在飞行中创建变量不是一个好主意,但我想知道它是否仍然可能是我最好的解决方案。

我的问题:我可以在计数器(array1, array2…)的帮助下在循环中创建数组,然后用计数器(类似:' array ' +str(counter)或' array ' +str(counter-1))调用它们吗?

为什么我想这样做:数据是400x700数组,一年15分钟的时间步长(所以我有35000个400x700数组)。每个时间步被单独读入python。现在我需要应用一个正在运行的过滤器,检查最后四个时间步是否相等(就元素而言),如果相等,则将所有四个值设置为零。下一个过滤器在第一个过滤器运行后使用数据,并检查最后12个时间步长的总和是否超过某个值。当两个过滤器都完成后,我想要对这些值求和,这样在年底时,我就有一个包含过滤后的累积值的400x700数组。

我没有足够的内存一次读入所有的数据。因此,我认为我可以创建一个循环,其中为每个时间步创建一个400x700数组的新变量,并运行两个过滤器。然后,我可以将过滤后的旧数组添加到年总和中并删除,这样我在内存中的时间步长(数组)在任何时候都不会超过16(4+12)个。

我不知道在没有任何代码显示的情况下问这样的问题是否正确,但我真的很感激你的帮助。

如果您的问题是关于在内存中保持一定数量的数组的最佳数据结构,在这种情况下,我建议使用三维数组。它的形状应该是(400, 700, 12)因为12是你需要回头看的数组数。的优点是,当您将新数组加载到较大的数组中时,您的内存使用将是恒定的。的缺点是需要手动移动所有数组。

如果您不想自己处理移位,我建议使用maxlen为12的deque

"我可以在一个循环中使用计数器(array1, array2…)创建数组,然后用计数器调用它们(类似于:' array ' +str(counter)或' array ' +str(counter-1)吗?"

这是一个非常普遍的问题,我想很多程序员最终都会面临。两个Python的堆栈溢出示例:

  • 在python中动态生成变量名
  • 如何在循环中创建不同的变量名称?(Python)

从中吸取的教训是不要使用动态变量名,而是将想要处理的数据块放在一个包含的数据结构中。

数据结构可以是list, dict或Numpy数组。此外,@Midnighter提出的collections.deque似乎是这样一个运行过滤器的一个很好的候选。

最新更新