matplotlib的histogramdd如何工作?

时间:2012-11-03 01:49:13

标签: python numpy histogram

我发现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似乎没有意义。< / p>

这应该如何解释?

由于

1 个答案:

答案 0 :(得分:5)

<强>更新

我上次错了。现在这是histogramdd的正确解释。首先,在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。 edges表示每个维度的bin。在此示例中,[1,2,4]计算如下:1属于array([1.,2.,3.,4.])的第一个bin,因为它介于1和2之间,2属于array([ 1. , 1.33333333, 1.66666667, 2. ])的第三个bin,因为它位于1.6666667之间2和4属于array([ 1. , 3.33333333, 5.66666667, 8. ])的第二个bin,因为它在3.33333333和5.66666667之间。因此,我们有第一个bin,第三个bin和第二个bin作为点[1,2,4]的坐标。这意味着我们在第一个数组,第三行,第二列中计算该元素:

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

我添加了一个*,让您更容易识别它。第二个坐标[4,2,8]分别位于x,y,z的第三个bin,第三个bin和第三个bin中(第三个数组,第三行,第三列):

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

作为最后一个例子,第三个坐标[3,2,1]分别位于x,y,z的第三个bin,第三个bin和第一个bin中(第三个数组,第三行,第一列):

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