scipy.stats.binned_statistic_dd()的输出
我正在尝试使用 scipy.stats.binned_statistic_dd,但是我完全搞不懂它的输出结果。有没有人能给我点建议?
看看这个简单的示例程序:
import scipy
scipy.__version__
# '0.14.0'
import numpy as np
print scipy.stats.binned_statistic_dd([np.ones(10), np.ones(10)], np.arange(10), 'count', bins=3)
#(array([[ 0., 0., 0.],
# [ 0., 10., 0.],
# [ 0., 0., 0.]]),
# [array([ 0.5 , 0.83333333, 1.16666667, 1.5 ]),
# array([ 0.5 , 0.83333333, 1.16666667, 1.5 ])],
# array([12, 12, 12, 12, 12, 12, 12, 12, 12, 12]))
文档中说输出结果是:
statistic : ndarray, 形状(nx1, nx2, nx3,...) 每个二维箱子里选定统计量的值
edges : ndarray列表 描述每个维度的(nxi + 1)箱子边界的D数组列表
binnumber : 一维整数ndarray 这个数组给每个观察值分配一个整数,表示这个观察值落在哪个箱子里。这个数组的长度和输入的值相同。
在这个例子中,statistic的结果很合理,我要求的是'计数',结果是10,说明有10个元素都在同一个箱子里。edges的结果也很合理,数据是二维的,我想要3个箱子,所以得到了4个合理的边界。
但是,binnumber的结果我完全不懂,array([12, 12, 12, 12, 12, 12, 12, 12, 12, 12])
,确实有10个数字,长度和输入的数据np.arange(10)
一样,但数字12根本没有意义。 我错过了什么?12并不是一个在多维数组中展开的箱子索引,因为每个维度有3个箱子,我最多应该看到数字到9。那12到底在告诉我什么呢?
1 个回答
binnumbers
中的值是一个展开的索引,表示一些箱子(也叫“区间”),其中还包括一组额外的“超出范围”的箱子。
在这个例子中,
In [40]: hst, edges, bincounts = binned_statistic_dd([np.ones(10), np.ones(10)], None, 'count', bins=3)
In [41]: hst
Out[41]:
array([[ 0., 0., 0.],
[ 0., 10., 0.],
[ 0., 0., 0.]])
这些箱子的编号如下:
0 | 1 | 2 | 3 | 4
-----+-----+-----+-----+-----
5 | 6 | 7 | 8 | 9
-----+-----+-----+-----+-----
10 | 11 | 12 | 13 | 14
-----+-----+-----+-----+-----
15 | 16 | 17 | 18 | 19
-----+-----+-----+-----+-----
20 | 21 | 22 | 23 | 24
“超出范围”的箱子没有包含在hst
中;hst
中的数据对应的箱子编号是6、7、8、11、12、13、16、17和18。这就是为什么bincounts
中的所有值都是12的原因:
In [42]: bincounts
Out[42]: array([12, 12, 12, 12, 12, 12, 12, 12, 12, 12])
你可以使用range
参数来强制将计数放入外部箱子。例如,通过将坐标的范围设置为[2, 3]和[0, 0.5],这样第一个坐标的所有值都在它们的范围左侧,而第二个坐标的所有值都在它们的范围右侧,所有点最终都会落入右上角的外部箱子,也就是箱子索引4:
In [51]: binned_statistic_dd([np.ones(10), np.ones(10)], None, 'count', bins=3, range=[[2,3],[0,0.5]])
Out[51]:
(array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]]),
[array([ 2. , 2.33333333, 2.66666667, 3. ]),
array([ 0. , 0.16666667, 0.33333333, 0.5 ])],
array([4, 4, 4, 4, 4, 4, 4, 4, 4, 4]))