认为我终于用
cumsum向量化解决方案的技巧破解了它-
def create_ranges(a): l = a[:,1] - a[:,0] clens = l.cumsum() ids = np.ones(clens[-1],dtype=int) ids[0] = a[0,0] ids[clens[:-1]] = a[1:,0] - a[:-1,1]+1 out = ids.cumsum() return out
样品运行-
In [416]: a = np.array([[4,7],[10,16],[11,18]])In [417]: create_ranges(a)Out[417]: array([ 4, 5, 6, 10, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 16, 17])In [425]: a = np.array([[-2,4],[-5,2],[11,12]])In [426]: create_ranges(a)Out[426]: array([-2, -1, 0, 1, 2, 3, -5, -4, -3, -2, -1, 0, 1, 11])
如果给定开始和停止两个
1D数组,则只需要使用它们代替第一列和第二列即可。为了完整起见,这是完整的代码-
def create_ranges(starts, ends): l = ends - starts clens = l.cumsum() ids = np.ones(clens[-1],dtype=int) ids[0] = starts[0] ids[clens[:-1]] = starts[1:] - ends[:-1]+1 out = ids.cumsum() return out



