Pythonic方法从分裂点索引整数的间隔

时间:2017-11-02 18:24:43

标签: python python-3.x

我根据一组分裂点编码一个hash-table-ish索引机制,该机制返回一个整数的区间数(0到n)。

例如,如果将整数分割为值3(一个分割点,即两个间隔),我们可以使用简单的比较找到每个数组元素的间隔号:

>>> import numpy as np
>>> x = np.array(range(7))
>>> [int(i>3) for i in x]
[0, 0, 0, 0, 1, 1, 1]

当有多个间隔时,我们可以定义如下函数:

>>> def get_interval_id(input_value, splits):                                                                                                                                                               
...     for i,split_point in enumerate(splits):
...         if input_value < split_point:
...             return i
...     return len(splits)
... 
>>> [get_interval_id(i, [2,4]) for i in x]
[0, 0, 1, 1, 2, 2, 2]

但是这个解决方案并不优雅。是否有任何Pythonic(更好)的方式来完成这项工作?

3 个答案:

答案 0 :(得分:2)

Python本身并没有这个过程的易处理函数,称为 binning 。如果您愿意,可以将函数包装成单行命令,但这种方式更具可读性。

但是,数据框包通常具有全功能的分箱方法; Python中最受欢迎的是PANDAS。这允许您以相等的间隔,相等的分区(每个箱中相同数量的条目)或自定义拆分值(您的情况)收集或分类值。有关详细讨论和示例,请参阅this question

当然,这意味着您必须安装并导入pandas并将列表转换为数据框。如果这太麻烦了,那就保持当前的实施;它可读,直截了当,而且相当短。

答案 1 :(得分:2)

由于您已经在使用它,我建议您使用digitize中的numpy方法:

>>> import numpy as np
>>> np.digitize(np.array([0, 1, 2, 3, 4, 5, 6]), [2, 4])
array([0, 0, 1, 1, 2, 2, 2])

来自documentation

  

返回输入数组中每个值的bin的索引   所属

答案 2 :(得分:1)

如何将整个过程包装在一个函数中而不是仅仅过程的一半?

>>> get_interval_ids([0 ,1, 2, 3, 4, 5 ,6], [2, 4])
[0, 0, 1, 1, 2, 2, 2]

,你的功能看起来像

def get_interval_ids(values, splits):

    def get_interval_id(input_value):
        for i,split_point in enumerate(splits):
            if input_value < split_point:
                return i
        return len(splits)

    return [get_interval_id(val) for val in values]