Python:通过四舍五入将列表中的#值分配给bin

时间:2016-09-08 04:25:42

标签: python numpy grouping rounding bins

我想要一个可以接受一系列和一组箱子的功能,并且基本上会向上舍入到最近的箱子。例如:

np.digitize(my_series, bins= [1,2,3], right=False)
> [1, 1*, 2, 2*, 2*, 3]

这似乎非常接近Numpy's Digitize的意图,但它会产生错误的值(错误值的星号):

np.digitize(my_series, bins= [3,2,1], right=True)
> [3, 2, 2, 1, 1, 1]

从文档中可以清楚地看出错误的原因:

  

我返回的每个索引都是 bins [i-1]< = x<箱子[i] 如果箱子是   单调增加,或 bins [i-1]> x> = bins [i] 如果是bins   单调递减。如果x中的值超出范围   根据需要返回bins,0或len(bin)。如果对是真,   然后关闭右边的bin,使得索引i是这样的   箱[i-1]< x< = bins [i]或bins [i-1]> = x>箱子[i]``如果箱子是   单调增加或减少。

如果我输入值减少并将“正确”设置为True,我可以更接近我想要的东西......

table

然后我将不得不考虑一种基本上有条理地逆转具有最高编号(3)的最低编号(1)的方法。当只有3个垃圾箱时很简单,但当垃圾箱的数量变长时会变得更加毛茸茸......必须有更优雅的方式来做这一切。

3 个答案:

答案 0 :(得分:1)

我相信np.searchsorted会做你想做的事:

  

将索引查找到已排序的数组a中,如果相应的话   v中的元素在索引之前插入,即a的顺序   被保留。

In [1]: my_series = [1, 1.5, 2, 2.3, 2.6, 3]

In [2]: bins = [1,2,3]

In [3]: import numpy as np

In [4]: [bins[k] for k in np.searchsorted(bins, my_series)]
Out[4]: [1, 2, 2, 3, 3, 3]

(从numpy 1.10.0开始,digitizesearchsorted实现。)

答案 1 :(得分:1)

另一种方式是:

In [25]: def find_nearest(array,value):
    ...:     idx = (np.abs(array-np.ceil(value))).argmin()
    ...:     return array[idx]
    ...: 

In [26]: my_series = np.array([ 1, 1.5, 2, 2.3,  2.6,  3])

In [27]: bins = [1, 2, 3]

In [28]: [find_nearest(bins, x) for x in my_series]
Out[28]: [1, 2, 2, 3, 3, 3]

答案 2 :(得分:1)

我们可以简单地使用np.digitizeright选项设置为True来获取索引,然后从bins中提取相应的元素,引入{{1}像这样 -

np.take