scipy.stats.binned_statistic_dd()的输出

2 投票
1 回答
1713 浏览
提问于 2025-04-18 17:26

我正在尝试使用 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 个回答

3

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]))

撰写回答