2010-08-11 64 views
3

我們已經爲單獨的日子準備了一組數據 - 第一個屬性是時間戳,其餘是值。將numpy recarray(的一部分)轉換爲2d數組?

其中的幾項:

ts    a b c 
2010-08-06 08:00, 1.2, 3.4, 5.6 
2010-08-06 08:05, 1.2, 3.4, 5.6 
2010-08-06 08:10, 1.2, 3.4, 5.6 
2010-08-06 08:15, 2.2, 3.3, 5.6 
2010-08-06 08:20, 1.2, 3.4, 5.6 

我們想生產的每個值的平均值的數組(因爲如果你打下都在彼此的頂部當天的數據,以及所有平均排列的值)。時間戳時間全都匹配,所以我們可以通過創建一個帶有時間戳結果recarray做到這一點,和其他列全部爲0,然後做這樣的事情:

for day in day_data: 
    result.a += day.a 
    result.b += day.b 
    result.c += day.c 

result.a /= len(day_data) 
result.b /= len(day_data) 
result.c /= len(day_data) 

這似乎是一個更好的辦法是轉換每天用一個數字去除數字(砍掉時間戳),然後在一個操作中對它們進行全部元素平均,但是我們無法找到一種方法來做到這一點 - 它總是一個1d的對象數組。

有誰知道如何做到這一點?

回答

8

有幾種方法可以做到這一點。一種方法是選擇recarray的多個列,並且施展他們的花車,然後重塑回一個二維數組:

new_data = data[['a','b','c']].astype(np.float).reshape((data.size, 3)) 

或者,你可能會考慮這樣的事情(可忽略的速度較慢,但​​更易讀):

new_data = np.vstack([data[item] for item in ['a','b','c']]).T 

另請注意,查看pandas進行這些操作可能是個好主意,這樣您就可以輕鬆處理異構數據。

+2

太好了,謝謝!作爲一個整體,我仍然努力習慣於對數組進行處理 - 我的直覺是單獨對元素進行處理。從我的測試中發現一個注意事項 - 雖然.view(np.float)部分沒有製作副本,但花式切片確實如此。 – babbageclunk 2010-08-12 10:02:06

+1

@Joe:如果我沒有弄錯,@wilberforce對於副本是正確的:'data [['a','b','c']] .base'爲None,所以這意味着它擁有它的數據並不從'data'繼承它。這是有道理的,因爲這些字段通常不是連續的。如果您確認這一點,最好更新您的答案。 :) – EOL 2013-07-29 09:32:02

+0

@EOL - 你是對的! (我不知道我當時在想什麼......) – 2013-07-30 01:49:08