我根据一组分裂点编码一个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(更好)的方式来完成这项工作?
答案 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])
返回输入数组中每个值的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]