Упрощенная версия вашей функции и a
, который должен выделять действие:
In [344]: def myfunc(x,y):
...: return 2*x + y
...: a = np.eye(5)
In [345]: a
Out[345]:
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
In [346]: res = myfunc(a[0],a[1])
In [347]: res
Out[347]: array([2., 1., 0., 0., 0.])
In [348]: for i in a[2:]:
...: res = myfunc(res,i)
...:
In [349]: res
Out[349]: array([16., 8., 4., 2., 1.])
В Python есть функция reduce
для многократного применения функции к списку.В Py3 это в functools
:
In [355]: functools.reduce(myfunc, a)
Out[355]: array([16., 8., 4., 2., 1.])
Или начиная с нуля res
и применяется ко всему массиву:
In [357]: res = np.zeros(a.shape[1])
In [358]: for i in a:
...: res = myfunc(res,i)
...:
In [359]: res
Out[359]: array([16., 8., 4., 2., 1.])
Для сохранения промежуточных результатов:
In [361]: res = [np.zeros(a.shape[1])]
...: for i in a:
...: temp = myfunc(res[-1],i)
...: res.append(temp)
In [362]: res
Out[362]:
[array([0., 0., 0., 0., 0.]),
array([1., 0., 0., 0., 0.]),
array([2., 1., 0., 0., 0.]),
array([4., 2., 1., 0., 0.]),
array([8., 4., 2., 1., 0.]),
array([16., 8., 4., 2., 1.])]
Это понятие accumulate
.numpy
ufunc
имеют оба значения reduce
и accumulate
и будут быстрее, если с ними можно написать myfunc
.Но это не работает в общем случае.
In [363]: np.add.accumulate(a,axis=0)
Out[363]:
array([[1., 0., 0., 0., 0.],
[1., 1., 0., 0., 0.],
[1., 1., 1., 0., 0.],
[1., 1., 1., 1., 0.],
[1., 1., 1., 1., 1.]])