範圍我有以下的數組:陣列與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