numpy ndarrays: строковые и столбчатые операции

Если бы я хотел применить функцию row-wise (или по столбцу) к ndarray, я бы посмотрел на ufuncs (не похоже на это) или на какой-то тип вещания массива (не то, что я ищу)? ?

редактировать

Я ищу что-то вроде функции R. Например,

apply(X,1,function(x) x*2) 

будет умножать 2 на каждую строку X на анонимно определенную функцию, но также может быть именованной функцией. (Это, конечно, глупый, надуманный пример, в котором apply самом деле не требуется). Нет никакого общего способа применения функции по оси «Numpy»,?

Во-первых, многие функции 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)