Массив диапазонов с NumPy - PullRequest
2 голосов
/ 13 марта 2011

У меня есть следующий массив:

>>> 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?

Ответы [ 2 ]

1 голос
/ 13 марта 2011

Я понял это:

>>> 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 голосов
/ 11 января 2018

Это на самом деле быстрее?У меня аналогичная потребность, и

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...