2011-09-14 28 views
1

我想知道什麼是通過給定特徵來求和數組元素的最有效方法。例如,我有1000個數據的繪製,而我所尋找的是每個性別(特定年份)疾病的每個繪製(列)的總和(即,繪製是按性別,年份,疾病和我想要的每年和疾病的性別總和)。在Python中按特徵求和數組

import numpy as np 
year = np.repeat((1980, 1990 , 2000, 2010), 10) 
sex = np.array(['male', 'female']*20) 
disease = np.repeat(('d1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8'), 5) 
draws = np.random.normal(0, 1, size=(sex.shape[0], 1000)) 

如何讓有跨越男女雙方戰平的某一年,疾病和數組,這將是形狀(20,1000)有什麼想法?我還需要能夠在數據不是完全平方的情況下做到這一點(有疾病年,只有1性)。

+1

你見過熊貓圖書館http://pandas.sourceforge.net/?我對這件事不太瞭解,但前些天看到它,並認爲如果我曾經使用過標記的數據,那麼值得一看。 – tom10

+0

查看接受的答案這是[SO問題](http://stackoverflow.com/questions/7169240/moving-large-sql-query-to-numpy/7170135#7170135)這是針對將SQL查詢轉換爲NumPy語法(你的Q中的查詢結構是在SQL「SUM ... WHERE ... ORDERBY ...,這是在這個評論鏈接到SO問題的查詢結構), – doug

回答

1
import numpy as np 
import itertools 
import csv 

year = np.repeat((1980, 1990 , 2000, 2010), 10) 
sex = np.array(['male', 'female']*20) 
disease = np.repeat(('d1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8'), 5) 
draws = np.random.normal(0, 1, size=(sex.shape[0], 1000)) 

years=np.unique(year) 
diseases=np.unique(disease) 

draw_sums = dict(((y,d), draws[(year==y)&(disease==d)].sum(axis=0)) 
        for y,d in itertools.product(years,diseases)) 

這會導致每個(年份,疾病)與相應的平局總和相關的字典。寫draw_sumscsv,你可以做這樣的事情:

with open('/tmp/test.csv','w') as f: 
    writer=csv.writer(f) 
    writer.writerow(['year', 'date']+['draw{i}'.format(i=i) for i in range(1,1001)]) 
    for yeardate,draws in sorted(draw_sums.items()): 
     writer.writerow(list(yeardate)+draws.tolist()) 
+0

這看起來正是我所需要的,謝謝所以很多,你能告訴我一個很好的方法來跟蹤輸出「arr」所對應的年數/疾病嗎?這會產生陣列,但我不知道哪一行對應於哪一年的疾病,再次感謝 – mike

+0

@mike:我想我會用一個字典,我已經編輯了上面的答案 – unutbu

+0

看起來好像字典在跟蹤年/疾病和繪製之間的關係方面做得很好,但是按照這個計算,我需要寫一個.csv文件,其中第一列爲第二列作爲疾病,以下1000列是抽籤。有沒有一個好的方法來做到這一點?謝謝。 – mike

0

這是一個典型的組通過的問題,它可以在一個完全量化的方式,使用numpy_indexed包(免責聲明得到有效解決:我的作者)

keys, values = npi.group_by((year, disease)).sum(draws) 
for key, value in zip(zip(*keys), values): 
    print(key, value.shape) 
相關問題