Aff*_*tus 5 python grouping numpy rounding bins
我想要一个可以采用一系列和一组垃圾箱的函数,并且基本上四舍五入到最近的垃圾箱。例如:
my_series = [ 1, 1.5, 2, 2.3, 2.6, 3]
def my_function(my_series, bins):
...
my_function(my_series, bins=[1,2,3])
> [1,2,2,3,3,3]
Run Code Online (Sandbox Code Playgroud)
这似乎与Numpy 的 Digitize的意图非常接近,但它产生了错误的值(错误值的星号):
np.digitize(my_series, bins= [1,2,3], right=False)
> [1, 1*, 2, 2*, 2*, 3]
Run Code Online (Sandbox Code Playgroud)
错误的原因从文档中很清楚:
i 返回的每个索引都满足bins[i-1] <= x < bins[i]如果 bins 单调递增,或者bins[i-1] > x >= bins[i]如果 bins 单调递减。如果 x 中的值超出 bin 的边界,则根据需要返回 0 或 len(bins)。如果 right 为 True,则右 bin 关闭,因此索引 i 使得 bins[i-1] < x <= bins[i] 或 bins[i-1] >= x > bins[i]``如果 bins 分别单调递增或递减。
如果我输入递减的值并将“正确”设置为真,我可以更接近我想要的...
np.digitize(my_series, bins= [3,2,1], right=True)
> [3, 2, 2, 1, 1, 1]
Run Code Online (Sandbox Code Playgroud)
但随后我将不得不考虑一种基本上有条不紊地将最低数字分配(1)与最高数字分配(3)颠倒的方法。当只有 3 个垃圾箱时这很简单,但是当垃圾箱的数量变长时会变得更毛茸茸……必须有一种更优雅的方式来做这一切。
我们可以简单地使用np.digitize它的right选项集 asTrue来获取索引,然后提取相应的元素 off bins,引入np.take,就像这样 -
np.take(bins,np.digitize(a,bins,right=True))
Run Code Online (Sandbox Code Playgroud)