2012-05-25 49 views
2

我有一系列的數字,我與上面的代碼bin。是否有可能返回每個垃圾箱的最大數量?Numpy直方圖,如何獲取每個垃圾桶的最大值

看一看示例代碼:

from numpy import * 


    a=array([1,4,5,6,7.8,9,3.4,5.,6,3.5,6,8,9,10]) 

    bins=arange(0,11,1) 

    h=hist(a,bins=bins) 

    h=hist(a,bins=bins,weights=a) 

這是返回

(array([ 0. , 1. , 0. , 6.9, 4. , 10. , 18. , 7.8, 8. , 28. ]), array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) 

我想知道是否有可能獲得3.5(也就是3之間的最大數是什麼和4)而不是第四個倉中的6.9。

回答

1

這會給你的每個元素的最大值在一個垃圾桶,並0如果有在bin沒有元素:

print [max(a[(a>=(i))&(a<i+1)]) if a[(a>=(i))&(a<i+1)].size else 0 for i in bins] 
[0, 1.0, 0, 3.5, 4.0, 5.0, 6.0, 7.7999999999999998, 8.0, 9.0, 10.0] 

更改+1你的窗口尺寸,使其有用。

+0

謝謝,這是我一直在尋找。在2D中擴展很容易嗎? – Brian

+1

@Matteo - 應該沒問題。我想這取決於你的意思。在最簡單的情況下,你只需將你的數組變平,然後執行上述操作。 – fraxel

1

您可以使用numpy.digitize。請注意,標籤比第一倉較小的值以0

a[np.digitize(a,bins) == 4].max() 

一個屏蔽數組這裏是有用的:

import numpy.ma as ma 
a2 = ma.empty((len(bins),len(a))) 
a2.data[...] = a 
a2.mask = np.digitize(a,bins)-1 != bins[:,np.newaxis] 
a2.max(axis=1).filled(np.nan) 

array([ nan, 1. , nan, 3.5, 4. , 5. , 6. , 7.8, 8. , 
     9. , 10. ]) 
+0

感謝它很有用,但我想以直方圖函數的相同方式返回一個數組。此外,是否有可能將此擴展爲2D直方圖? – Brian

+1

@Matteo擴展了計算數組的答案。不幸的是,這隻適用於1D。 –

+0

我感謝您的幫助!我會盡力讓它工作。 – Brian