2016-03-10 3 views
0

Я часто работаю с массивами numpy, представляющими критические времена в временном ряду. Затем я хочу перебирать диапазоны и запускать на них операции. Например:Iterate over 'zipped' диапазоны массива numpy

rngs = [0, 25, 36, 45, ...] 
output = [] 
for left, right in zip(rngs[:-1], rngs[1:]): 
     throughput = do_stuff(array[left:right])... 
     output.append(throughput) 

Есть ли менее неловкий способ сделать это?

+0

Предполагая, что 'rngs' нерегулярны и' dostuff' может работать только на одном срезе, в то время, выглядит хорошо. Но также посмотрите на 'ufunc.reduceat' – hpaulj

+0

Возможный дубликат [Итерировать список как пару (текущий, следующий) в Python] (http://stackoverflow.com/questions/5434891/iterate-a-list-as-pair- current-next-in-python) – Reti43

+0

Хотя я думаю, что он хочет что-то особенное для 'numpy'; а не только список. – hpaulj

ответ

0

Вы можете использовать генератор enumerate

rngs = [0, 25, 36, 45, ...] 
output = [] 
for index, _ in enumerate(rngs[:-1]): 
     throughput = do_stuff(array[index:index+1])... 
     output.append(throughput) 

в одной строке со списком понимания:

rngs = [0, 25, 36, 45, ...] 
output = [do_stuff(array[index:index+1]) for index, _ in enumerate(rngs[:-1])] 
+0

Я не вижу разницы между этим и 'для индекса в диапазоне (len (rngs) -1):' или 'xrange()' для Python 2. Кроме того, нет разворачивания кортежа, как в 'index, _', и вы не нужно создавать 'rngs [: - 1]'. – Reti43