2013-11-03 66 views
1

我已經在這裏提出了幾個關於同一主題的問題,但我真的不想讓我正在研究的教授失望。這是我第一次使用Python,而且我可能已經有點頭痛了。Python noob:操縱數組

反正,我被送到一個文件的讀取,並能使用該命令:

SNdata = numpy.genfromtxt('...', dtype=None, 
usecols (0,6,7,8,9,19,24,29,31,33,34,37,39,40,41,42,43,44), 
names ['sn','off1','dir1','off2','dir2','type','gal','dist', 
'htype','d1','d2','pa','ai','b','berr','b0','k','kerr']) 

sn只是一個特定超新星的名稱的數組; type是一個超新星類型的陣列(Ia或II)等。

我需要做的第一件事情之一是簡單地計算給定SN類型(Ia或II)的某些特性的概率。

例如,列htype是星系的形態(作爲整數1給出=橢圓至8 =不規則)。我需要計算給定TypeIa的橢圓和給定TypeII的橢圓的概率,對於所有的整數可以達到8.

對於橢圓,我知道我只需要將htype = 1 and type = Ia除以元素總數爲type = Ia。然後將具有htype = 1 and type = II的元素的數量除以具有type = II的元素的總數。

我只是不知道如何爲此編寫代碼。我打算先找到每種類型的總數,然後運行一個for循環來查找具有特定htype的元素數type(Ia或II)。

任何人都可以幫助我開始呢?如果需要澄清,請告訴我。

非常感謝。

+2

查看http://pandas.pydata.org/庫。從長遠來看它會幫助你。如果您可以包含一些示例數據,那麼閱讀您的問題的人會很有幫助。你可以簡化這個問題,把它簡化成只是你問的那些列,然後把其餘的東西添加到你自己的代碼中,一旦你弄清楚了事情...... – YXD

回答

1

您可以使用collections.Counter來統計所需的觀測值。

例如,

from collections import Counter 
types_counter = Counter(row['type'] for row in data) 

會給你想要的SN types的計數。

htypes_types_counter = Counter((row['type'], row['htype']) for row in data) 

計數的形態和類型。然後,讓你的橢圓的評價,只是劃分

1.0*htypes_types_counter['Ia', 1]/types_counter['Ia'] 
4

numpy的支持布爾數組操作,這將使你的代碼相當簡單寫。舉例來說,你可以這樣做:

htype_sums = {} 
for htype_number in xrange(1,9): 
    htype_mask = SNdata.htype == htype_number 
    Ia_mask = SNdata.type == 'Ia' 
    II_mask = SNdata.type == 'II' 

    Ia_sum = (htype_mask & Ia_mask).sum()/Ia_mask.sum() 
    II_sum = (htype_mask & II_mask).sum()/II_mask.sum() 
    htype_sums[htype_number] = (Ia_sum, II_sum) 

每個_mask變量都是布爾數組,所以當你總結他們算你是True元素的數量。

+1

+1,儘管我更喜歡4位縮進 – alko

+0

如果我是單獨給他們的話,我可以得到正確的金額。但是,當我運行for循環時,我的總和只適用於'htype = 10'。我如何得到8個不同的款項? – user2909019

+0

@ user2909019:我編輯了我的答案,將結果存儲在字典中。這可能不是您程序的最佳結構,但它可以使您輕鬆檢查結果。 – perimosocordiae