2011-04-11 79 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數組。