使用numpy创建范围数组

2 投票
2 回答
2508 浏览
提问于 2025-04-16 13:35

我有一个这样的数组:

>>> 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来生成这个,而不需要使用循环呢?

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)和你的用法一样。)

(根据我短暂的经验,repeat的速度非常慢——至少在python 3.6中是这样的。)

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

撰写回答