2011-03-13 173 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)