如何为stats.binned_statistic编写一个函数来计算每个bin中的值的数量,而不重复?

时间:2015-10-19 21:21:17

标签: python

有没有办法计算bin中的值数而不计算重复数? stats.binned_statistic似乎对我最有帮助,但唯一的问题是我似乎无法定义一个向我返回正确值的计数的函数。这就是我到目前为止所做的:

bin_count, bin_edges, bin_number = stats.binned_statistic(time, values,   statistic=lambda y: len(set(y)), bins=range(0, finaltime, 5))

,出现的错误是“TypeError:只有一个元素的整数数组可以转换为索引”

所以如果我有时间= [1,1,1,2,4,7,8,10]和值= [7,3,9,3,5,7,11,45],我想bin_count为[4,3]而不是[5,3],这是此函数中预定义的'count'给我的。

如果有人可以帮我解决这个问题,或者可能采用其他方法来解决这个问题,那就太棒了!

1 个答案:

答案 0 :(得分:0)

在将时间数组传递给binned_statistic之前,您可以将其唯一。

bc,be,bn = binned_statistic(list(set(time)),None,statistic='count',bins=2)

将callables传递给binned_statistic似乎永远不会起作用(尝试传递statistic = sum和statistic =“sum”。它们应该是等价的,但它们不是。奇怪的。)。

尝试对你的价值进行分类并对自己进行去复制:

dv = numpy.digitize(time,numpy.arange(0,10,5))
udict = {}
udict.update([((dv[i],v),t) for i,(t,v) in enumerate(zip(time,values))])
nv,nt = zip(*[(k[1],udict[k]) for k in udict.keys()])
bc,be,bn = binned_statistic(nt,nv,statistic='count',bins=2)

基本上,将您的值传递给numpy.digitize,它将为每个bin分配一个bin。 enumerate(zip(time,values))生成一个编号的时间 - 值对列表,我稍微重新排列以构建由bin值组合键入的字典,其中值是相应的时间。然后检索字典的每个成员将产生一个新的值和时间数组,其中时间 - 值对于特定bin中的值是唯一的。然后根据规范运行binned_statistic。

((这非常难以阅读等等。我欢迎优秀的解决方案。当你想保留一些可能不同的其他数据时,制作独特是很棘手的。)