我想要一个可以接受一系列和一组垃圾箱的函数,并且基本上四舍五入到最近的垃圾箱。例如:
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]
这似乎非常接近Numpy 数字化 http://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html旨在执行此操作,但它会产生错误的值(星号表示错误值):
np.digitize(my_series, bins= [1,2,3], right=False)
> [1, 1*, 2, 2*, 2*, 3]
从文档中可以清楚地看出错误的原因:
我返回的每个索引都是这样的bins[i-1] 如果垃圾箱是
单调递增,或者bins[i-1] > x >= bins[i]如果垃圾箱是
单调递减。如果 x 中的值超出范围
bins、0 或 len(bins) 根据需要返回。如果正确的是真的,
然后关闭右侧的 bin,以便索引 i 是这样的
bins[i-1] = x > bins[i]`` 如果 bins 是
分别单调增加或减少。
如果我输入递减的值并将“right”设置为 True,我可以更接近我想要的...
np.digitize(my_series, bins= [3,2,1], right=True)
> [3, 2, 2, 1, 1, 1]
但随后我必须想出一种方法,基本上有条不紊地将最低数字分配 (1) 与最高数字分配 (3) 颠倒过来。当只有 3 个垃圾箱时,这很简单,但当垃圾箱数量变多时,就会变得更加麻烦……必须有一种更优雅的方法来完成这一切。