2017-05-16 111 views
1

我有一些數據,我在x和y中bin。然後,我將x數據箱中的數據歸一化,以使xbins中的所有數據總和爲1 ...因此,對於每個x處的每個y值,我有一個歸一化概率。numpy histogram2d數據的計算中位數

nA, binsx, binsy = np.histogram2d(dataA,dataB, 
             bins=[binsA,binsB],normed=False) 

    H = np.ma.masked_where(nA==0.0, nA) 
    for i in range(len(H[0,:])):  # Column index i, over len of row 0 
     colTot = np.sum(H[:,i]) 
     for j in range(len(H[:,0])): # Row index j, over len of column 0 
      H[j,i] = H[j,i]/colTot 

此時H沿着列歸......每個款項1

我的問題是,我怎麼能有效地產生每列中值?我相信我需要爲ybin的每個列(或xbin中的一組值)生成一個新數組,該數組的y值等於該ybin的原始(nA)計數。似乎令人費解......有沒有更簡單的方法?

這裏是我現在想:

nA, binsx, binsy = np.histogram2d(dataA,dataB, 
            bins=[binsA,binsB],normed=False) 
for j in range(nA[0,:].size): # Loop over number of columns 
    oneMass = np.array([]) 
    for i in range(nA[:,0].size): # loop over rows in y... 
     tmp = np.repeat(binsA[i],np.int32(nA[i,j])) 
     if tmp.size > 0: 
      oneMass = np.concatenate((oneMass,tmp)) 

    print('Median',np.median(oneMass)) 
+0

請提供一些測試數據,以便您的示例可以運行。 – JohanL

回答

2

如果您已經歸列,你可能只是做一個線性插值到0.5以上的累積概率函數:

cumCols = np.cumsum(H, axis = 1) 
medians = np.array([np.interp(.5, binsA, cumCols[:,i]) for i in range(len(binsA))]) 
+0

Thx!我認爲這是有效的...我已經將每個bin中的值轉換爲標準化概率...所以這將返回中值概率值 - 但我想我必須使用我的方法或類似的東西來獲取實際值每列中的中值。 – earnric