2011-04-11 80 views
3

我的示例代码是在python中,但我询问了一般原理。时变数据:元组与二维数组列表?

如果我在时间 - 值对中有一组数据,我应该将它们存储为二维数组还是作为元组列表?举例来说,如果我有这样的数据:

v=[1,4,4,4,23,4] 
t=[1,2,3,4,5,6] 

是一般最好将其存储这样的:

data=[v,t] 

或元组的列表:

data=[(1,1),(4,2)(4,3)...] 

是否有“标准”这样做的方式?

+2

这一切都取决于你打算如何使用数据。 – 2011-04-11 15:27:41

+0

这是我不知道将来如何使用数据的情况之一,尽管可能会对数据进行绘图和统计分析等操作,这就是为什么我决定JoshAdel的解决方案可能是最适合。 – 2011-04-13 10:05:06

回答

2

的总阵列容器可能是最好的选择。假设你的时间点没有定期间隔(因此你需要保持它的轨道,而不是仅仅使用索引),这使您可以采取设置喜欢你的整个数据的切片:

import numpy as np 
v=[1,4,4,4,23,4] 
t=[1,2,3,4,5,6] 

data = np.array([v,t]) 

,那么你可以切它可以轻松地获取数据的一个子集:

data[:,2:4] #array([[4, 4],[3, 4]]) 

ii = [1,2,5] # Fancy indexing 
data[:,ii] # array([[4, 4, 4], 
      #  [2, 3, 6]]) 
+0

谢谢!我认为,反思这可能是最合适的,因为除了简化切片之外,它还可以快速,自然地执行从数据制作图表等操作。 – 2011-04-11 16:01:02

+0

@Mike:很高兴我能帮上忙。如果您认为这是有用的,那么您应该对其投票并/或将其标记为解决方案。 – JoshAdel 2011-04-11 16:04:17

1

你可以试试字典吗?在其他语言中,这可能被称为哈希映射,哈希表,关联数组或其他意义相同的术语。当然,这取决于你打算如何访问你的数据。

相反的:

v=[1,4,4,4,23,4] 
t=[1,2,3,4,5,6] 

你必须:

v_with_t_as_key = {1:1, # excuse the name... 
        2:4, 
        3:4, 
        4:4, 
        5:23, 
        6:4} 

这是蟒蛇一个相当标准的结构,但如果顺序很重要,你可能想看看在有序dictionarycollections

+1

如果您想要轻松访问切片数据,则不建议使用这种方法。这将绑定您一次检索单个时间点,并且您必须操作/重新构建您的数据结构以通过单键或值对以外的方式获取它。 – JoshAdel 2011-04-11 15:32:04

+1

@JoshAdel:这是一个有效的点,尽管可以通过选择这种数据类型的不同实现来解决。实质上,这种关联数据结构使处理相关数据更容易处理代码,但根据您的项目可能会有其他外观@Mike – theheadofabroom 2011-04-11 15:37:30

4

如果速度是您最关心的问题,请在Python中查看Numpy。

一般来说,你应该选择一个数据结构,使数据处理自然和容易。之后担心速度,在知道它有效后!

对于一个简单的数据结构,如何元组的列表:

v=[1,4,4,4,23,4] 
t=[1,2,3,4,5,6] 

data=[(1,1),(4,2)(4,3)...] 

然后你就可以解开,像这样:

v,t=data[1] 
#v,t are 4,2 
+1

这种方法很好,除非您需要查找一个集合中的项目其他,当你可能希望使用关联数据类型,如字典。 – theheadofabroom 2011-04-11 15:41:36

0

我发现,探索和原型,它更方便地存储为列的列表/锯齿形排列,其中第一列是观测指标之后的每一列都是一个变量。

数据= [(1,2,3,4,5,6),(1,4,4,4,23,4)]

大多数我加载许多观察与时间许多变量,然后执行排序,格式化或显示其中一个或多个变量,甚至将两组数据与列作为参数进行连接。当我需要抽出一部分观测数据时,这种情况更为罕见。即使我这样做,使用一个函数返回给定一列观察索引的数据子集也会更方便。尽管如此,我仍然使用函数将锯齿状数组转换为2d数组并转置2d数组。