范围我有以下的数组:阵列与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
,有没有产生这种与numpy的,而无需使用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
,有没有产生这种与numpy的,而无需使用for循环更快的方法?
我想通了:
>>> 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])
>>>
这是真正快? 我也有类似的需求,
concatenate([range(l, r) for l, r in array((left, right)).T])
是快两倍
range(end[-1]) + repeat(left + end, right-left)
(其中end = cumsum(right - left)
跟你的一样)。
(在我的很短的经验,重复是很慢的 - 至少在Python 3.6)
看起来你找到了你的解决方案......这将是有趣的知道你为什么需要这一点,为什么在这个特定的格式。 – Benjamin 2011-03-14 15:09:35
我正在加速pycollada库(https://github.com/pycollada/pycollada)。 collada格式中的几何类型之一称为polylist,它将每个多边形的顶点数存储在数组中,如上面的''x''。我需要将输出范围设置为在单个阵列中快速对多边形进行三角化。 – jterrace 2011-03-14 18:58:50
你可以看到它是如何在我在这个提交中创建的triangleset()函数中工作的:https://github.com/pycollada/pycollada/commit/71682c5506aa098c1105db850029d98e217f724b#L0R219 – jterrace 2011-03-14 19:00:37