Python 带numpy的范围数组

Python 带numpy的范围数组,python,optimization,numpy,Python,Optimization,Numpy,我有以下数组: >>> x = numpy.array([2,4,2,3,1]) >>> x array([2, 4, 2, 3, 1]) 我想要这些值的范围数组。我可以这样创建它: >>> numpy.hstack( (numpy.arange(v) for v in x) ) array([0, 1, 0, 1, 2, 3, 0, 1, 0, 1, 2, 0]) 给定x,有没有一种更快的方法可以在不使用for循环的情况下使用numpy

我有以下数组:

>>> x = numpy.array([2,4,2,3,1])
>>> x
array([2, 4, 2, 3, 1])
我想要这些值的范围数组。我可以这样创建它:

>>> numpy.hstack( (numpy.arange(v) for v in x) )
array([0, 1, 0, 1, 2, 3, 0, 1, 0, 1, 2, 0])
给定
x
,有没有一种更快的方法可以在不使用for循环的情况下使用numpy生成此文件?

我想:

>>> x
array([2, 4, 2, 3, 1])
>>> ends = numpy.cumsum(x)
>>> ranges = numpy.arange(ends[-1])
>>> ranges = ranges - numpy.repeat(ends-x, x)
>>> ranges
array([0, 1, 0, 1, 2, 3, 0, 1, 0, 1, 2, 0])
>>> 
这真的更快吗? 我也有类似的需要,而且

串联([range(l,r)表示数组中的l,r((左,右)).T])

它的速度是它的两倍

范围(结束[-1])+重复(左+结束,右-左)

(其中
end=cumsum(右-左)
和您的一样)


(在我短暂的经验中,repeat非常慢——至少在python 3.6中是如此)

看起来您找到了解决方案。。。我很想知道为什么需要这个,为什么需要这种特殊的格式。collada格式中的一种几何体类型称为多段列表,它将每个多边形的顶点计数存储在一个数组中,如上面的
x
。我需要设置输出范围以在单个数组中快速三角化多边形。您可以在我在此提交中创建的triangleset()函数中看到它的工作原理: