如何为scipy的binned_statistic_2d定义自定义函数?

kjthegm6  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(118)

documentation for scipy的binned_statistic_2d函数给出了一个二维直方图的示例:

from scipy import stats
x = [0.1, 0.1, 0.1, 0.6]
y = [2.1, 2.6, 2.1, 2.1]
binx = [0.0, 0.5, 1.0]
biny = [2.0, 2.5, 3.0]
ret = stats.binned_statistic_2d(x, y, None, 'count', bins=[binx, biny])

有道理,但我现在要实现一个自定义函数。自定义函数的描述如下:
function:一个用户定义的函数,它接受一个一维数组的值,并输出一个单一的数字统计量。此函数将在每个bin中的值上调用。空bin将由函数([])表示,如果返回错误,则为NaN。
我不确定具体如何实现它,所以我想通过编写一个自定义函数来检查我的理解,该函数可以重新生成count选项。

def custom_func(values):
    return len(values)
x = [0.1, 0.1, 0.1, 0.6]
y = [2.1, 2.6, 2.1, 2.1]
binx = [0.0, 0.5, 1.0]
biny = [2.0, 2.5, 3.0]
ret = stats.binned_statistic_2d(x, y, None, custom_func, bins=[binx, biny])

但这会产生如下错误:

556 # Make sure `values` match `sample`
557 if(statistic != 'count' and Vlen != Dlen):
558     raise AttributeError('The number of `values` elements must match the '
559                          'length of each `sample` dimension.')
561 try:
562     M = len(bins)

AttributeError: The number of `values` elements must match the length of each `sample` dimension.

该自定义函数应该如何定义?

sigwle7e

sigwle7e1#

出现此错误的原因是在使用自定义统计函数时(或任何非count统计信息),则必须将某个数组或数组列表传递给values参数(元素的数量与x中的数量相匹配)。您不能像示例中那样将其保留为None,即使它是不相关的并且在计算每个仓中的数据点的计数时不被使用。
因此,要匹配结果,只需将相同的x对象传递给values参数:

def custom_func(values):
    return len(values)

x = [0.1, 0.1, 0.1, 0.6]
y = [2.1, 2.6, 2.1, 2.1]
binx = [0.0, 0.5, 1.0]
biny = [2.0, 2.5, 3.0]

ret = stats.binned_statistic_2d(x, y, x, custom_func, bins=[binx, biny])

print(ret)

# BinnedStatistic2dResult(statistic=array([[2., 1.],

# [1., 0.]]), x_edge=array([0. , 0.5, 1. ]), y_edge=array([2. , 2.5, 3. ]), binnumber=array([5, 6, 5, 9]))

结果与count统计信息的结果相匹配:

ret = stats.binned_statistic_2d(x, y, None, 'count', bins=[binx, biny])

print(ret)

# BinnedStatistic2dResult(statistic=array([[2., 1.],

# [1., 0.]]), x_edge=array([0. , 0.5, 1. ]), y_edge=array([2. , 2.5, 3. ]), binnumber=array([5, 6, 5, 9]))

相关问题