我正在尝试使用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]))
因此文档声称输出是:
统计:ndarray,shape(nx1,nx2,nx3,...)的值 在每个二维箱子中选择统计数据
边缘:列表 ndarrays描述(nxi + 1)bin边的D数组列表 每个维度
binnumber:1-D ndarray of int这将分配给每个人 观察一个整数,表示其中的bin 观察下降。数组的长度与值相同。
在示例中,统计数据很好,我要求'计数'并得到10,在同一个bin中有10个元素。边缘也很有道理,要结束的数据是维度2,我想要3个箱子,所以我得到了4个合理的边缘。
然后问题binnumber对我来说毫无意义,array([12, 12, 12, 12, 12, 12, 12, 12, 12, 12])
,确实有10个数字长度相同,输入数据np.arange(10)
,但数字12根本没有意义。我错过了什么12不是变成多D阵列的箱子的解开索引,因为每个维度中有3个箱子我可以看到最多9个数字。什么是12告诉我?
答案 0 :(得分:2)
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
中的数据对应于bin编号
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],所以所有的值都在
第一个坐标是其范围的左侧,第二个坐标中的所有值都是
在它们的范围的右边,所有的点最终都在右上方的外部容器中,这是
bin index 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]))