2011-03-13 172 views
2

范围我有以下的数组:阵列与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循环更快的方法?

+0

看起来你找到了你的解决方案......这将是有趣的知道你为什么需要这一点,为什么在这个特定的格式。 – Benjamin 2011-03-14 15:09:35

+0

我正在加速pycollada库(https://github.com/pycollada/pycollada)。 collada格式中的几何类型之一称为polylist,它将每个多边形的顶点数存储在数组中,如上面的''x''。我需要将输出范围设置为在单个阵列中快速对多边形进行三角化。 – jterrace 2011-03-14 18:58:50

+0

你可以看到它是如何在我在这个提交中创建的triangleset()函数中工作的:https://github.com/pycollada/pycollada/commit/71682c5506aa098c1105db850029d98e217f724b#L0R219 – jterrace 2011-03-14 19:00:37

回答

1

我想通了:

>>> 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]) 
>>> 
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)