Во-первых, многие функции numpy принимают аргумент axis
.С таким подходом возможно (и лучше) сделать то, что вы хотите.
Однако общий подход "применить эту функцию по строкам" будет выглядеть примерно так:
import numpy as np
def rowwise(func):
def new_func(array2d, **kwargs):
# Run the function once to determine the size of the output
val = func(array2d[0], **kwargs)
output_array = np.zeros((array2d.shape[0], val.size), dtype=val.dtype)
output_array[0] = val
for i,row in enumerate(array2d[1:], start=1):
output_array[i] = func(row, **kwargs)
return output_array
return new_func
@rowwise
def test(data):
return np.cumsum(data)
x = np.arange(20).reshape((4,5))
print test(x)
Имейте в виду, что мы можем сделать то же самое с помощью всего лишь:
np.cumsum(x, axis=1)
Часто существует более эффективный способ, чем универсальный подход, особенно с numpy.
Редактировать:
Я полностью забыл об этом, но вышеприведенное по существу эквивалентно numpy.apply_along_axis
.
Итак, мы могли бы переписать это как:
import numpy as np
def test(row):
return np.cumsum(row)
x = np.arange(20).reshape((4,5))
print np.apply_along_axis(test, 1, x)