2017-01-11 2 views
0

Скажите, что у меня есть фрагмент, например x[p:-q:n] или x[::n]. Я хочу использовать это для создания индекса, который будет передан в numpy.ufunc.reduceat(x, [p, p + n, p + 2 * n, ...]) или numpy.ufunc.reduceat(x, [0, n, 2 * n, ...]). Каков самый простой и эффективный способ сделать это?Как можно генерировать индексы numpy.ufunc.reduceat из объекта Python Slice

+0

Почему бы просто не использовать 'range'? 'list (range (0, len (x), n))' – Psidom

+0

Является ли это наиболее эффективным? –

+0

Эффективно, если вам нужен список индексов. – Psidom

ответ

3

Опираясь на комментарии:

In [351]: x=np.arange(100) 
In [352]: np.r_[0:100:10] 
Out[352]: array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90]) 
In [353]: np.add.reduceat(x,np.r_[0:100:10]) 
Out[353]: array([ 45, 145, 245, 345, 445, 545, 645, 745, 845, 945], dtype=int32) 
In [354]: np.add.reduceat(x,np.arange(0,100,10)) 
Out[354]: array([ 45, 145, 245, 345, 445, 545, 645, 745, 845, 945], dtype=int32) 
In [355]: np.add.reduceat(x,list(range(0,100,10))) 
Out[355]: array([ 45, 145, 245, 345, 445, 545, 645, 745, 845, 945], dtype=int32) 
In [356]: x.reshape(-1,10).sum(axis=1) 
Out[356]: array([ 45, 145, 245, 345, 445, 545, 645, 745, 845, 945]) 

и время:

In [357]: timeit np.add.reduceat(x,np.r_[0:100:10]) 
The slowest run took 9.30 times longer than the fastest. This could mean that an intermediate result is being cached. 
10000 loops, best of 3: 31.2 µs per loop 
In [358]: timeit np.add.reduceat(x,np.arange(0,100,10)) 
The slowest run took 85.75 times longer than the fastest. This could mean that an intermediate result is being cached. 
100000 loops, best of 3: 6.69 µs per loop 
In [359]: timeit np.add.reduceat(x,list(range(0,100,10))) 
The slowest run took 4.31 times longer than the fastest. This could mean that an intermediate result is being cached. 
100000 loops, best of 3: 11.9 µs per loop 
In [360]: timeit x.reshape(-1,10).sum(axis=1) 
The slowest run took 5.57 times longer than the fastest. This could mean that an intermediate result is being cached. 
100000 loops, best of 3: 11.5 µs per loop 

reduceat с arange выглядит лучше, но это должно быть проверено на более реалистичных данных. Скорости не отличаются от этого размера.

Значение r_ заключается в том, что оно позволяет использовать удобную нотацию для резки; он находится в файле с именем index_tricks.py.

С 10000 элемент x, времена 80, 46, 238, 51.

Смежные вопросы