我发现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>
这应该如何解释?
由于
答案 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.]]