2012-11-03 49 views
4

我發現直方圖混亂的輸出。例如:matplotlib的histogramdd是如何工作的?

h, edges = histogramdd([[1,2,1],[4,2,1]],bins=2) 

h -> [[ 1. 1.] 
    [ 1. 0.]] 
edges -> [array([ 1. , 1.5, 2. ]), array([ 1. , 2.5, 4. ])] 

也許我不懂documentation,但它似乎表明,輸入應與代表數據點N行,在這種情況下代表的尺寸(因此D列的陣列,我們處理三維中的兩個數據點),我想edges中的每個數組表示一個不同的維度,但似乎沒有根據輸出h有意義。

這應該如何解釋?

感謝

回答

4

UPDATE

我錯了最後一次。現在這是直方圖的正確解釋。首先,這是非常重要的histogramdd使用數組,否則會輸出錯誤的結果:

比較:

In [59]: h, edges = histogramdd([[1,2,4],[4,2,8],[3,2,1],[2,1,2],[2,1,3],[2,1,1],[2,1,4]],bins=3) 
h.shape 
Out[59]: (3, 3, 3, 3, 3, 3, 3) 

這樣:

In [60]: h, edges = histogramdd(array([[1,2,4],[4,2,8],[3,2,1],[2,1,2],[2,1,3],[2,1,1],[2,1,4]]),bins=3) 
h.shape 
Out[60]: (3, 3, 3) 

使用第二種方法,我們獲得了明顯的結果:

In [61]: h, edges = histogramdd(array([[1,2,4],[4,2,8],[3,2,1],[2,1,2],[2,1,3],[2,1,1],[2,1,4]]),bins=3) 
In [64]: h 
Out[64]: 
array([[[ 0., 0., 0.], 
     [ 0., 0., 0.], 
     [ 0., 1., 0.]], 

     [[ 3., 1., 0.], 
     [ 0., 0., 0.], 
     [ 0., 0., 0.]], 

     [[ 0., 0., 0.], 
     [ 0., 0., 0.], 
     [ 1., 0., 1.]]]) 
In [65]: edges 
Out[65]: 
[array([ 1., 2., 3., 4.]), 
array([ 1.  , 1.33333333, 1.66666667, 2.  ]), 
array([ 1.  , 3.33333333, 5.66666667, 8.  ])] 

我們的輸入是[1,2,4], [4,2,8], etc。邊代表每個維的箱。在這個例子中,[1,2,4]的計數如下:1屬於array([1.,2.,3.,4.])的第一個bin,因爲它在1和2之間,2屬於array([ 1. , 1.33333333, 1.66666667, 2. ])的第三個bin,因爲它介於1.6666667和2之間,屬於第二個bin的array([ 1. , 3.33333333, 5.66666667, 8. ]),因爲它是在3.33333333和5.66666667之間。所以我們有第一個bin,第三個bin和第二個bin作爲點[1,2,4]的座標。這意味着我們指望第一個數組中的元素,第三行第二列:

[[ 0., 0., 0.], 
[ 0., 0., 0.], 
[ 0., 1*., 0.]] 

我加了*,讓你更容易地識別它。第二座標[4,2,8]位於第三倉,第三bin和第三箱,用於X,Y,Z分別(第三陣列,第三行,第三列):

[[ 0., 0., 0.], 
[ 0., 0., 0.], 
[ 1., 0., 1.*]]]) 

作爲最後一個例子中,第三座標[3,2,1]分別位於x,y,z(第三排,第三排,第一列)的第三個倉,第三個倉和第一個倉中:

[[ 0., 0., 0.], 
[ 0., 0., 0.], 
[ 1.*, 0., 1.]]