2016-11-30 39 views
3

我有一個數組A,我試圖把它放到10個箱子裏。這是我所做的。Binning in Numpy

A = range(1,94) 
hist = np.histogram(A, bins=10) 
np.digitize(A, hist[1]) 

但產量有11個箱,而不是10,與放置在箱子11的最後一個值(93),當它應該已經在箱10.我可以用一個黑客修復它,但什麼是最這樣做的優雅方式?如何告訴數字化hist [1]中的最後一個bin是否包含在右側 - []而不是[)?

+0

np.histogram的輸出實際上具有10個二進制位;計數是'[10,9,9,9,10,10,9,9,10]'。也就是說,「直方圖」方法將最後一個箱的右邊界視爲包含在內。數字化不是;所以它與'histogram'準備的bin邊緣不太兼容。 – FTP

+0

謝謝zaq - 有沒有辦法獲得元素屬於哪個bin?雖然排序列表很容易,但是如果我有一個未排序的列表,這個問題就變得很具挑戰性。 –

回答

3

np.histogram的輸出實際上有10個分箱;最後一個(最右邊)容器包含最大元素,因爲其右邊緣是包含的(與其他容器不同)。

np.digitize方法不會產生這樣的異常(因爲它的用途不同),所以列表的最大元素被放入一個額外的bin。要獲得與histogram一致的箱分配,只需使用fmin將輸出digitize與箱數相加即可。

A = range(1,94) 
bin_count = 10 
hist = np.histogram(A, bins=bin_count) 
np.fmin(np.digitize(A, hist[1]), bin_count) 

輸出:

array([ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 
     2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 
     4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 
     6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 
     8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 
     10, 10, 10, 10, 10, 10, 10, 10])