Векторизация по строкам массива

У меня есть массив X, и я хочу применить функцию f ко всем строкам X:

# silly example
X = numpy.array([[1, 2, 3, 4, 5],
                 [6, 7, 8, 9, 0]], 'i')

def f(row): return sum(row)

y = numpy.vectorize(f, 'i')(rows(X))

Теперь y должно быть array([15,30], 'i'). Какой метод или магия нарезки реализует rows наиболее эффективным способом?


person Fred Foo    schedule 09.05.2011    source источник


Ответы (3)


NumPy реализует концепцию действия над определенной осью. Общая функция такова: numpy.apply_along_axis():

>>> numpy.apply_along_axis(sum, 1, X)
array([15, 30])

(где sum конечно можно заменить чем угодно).

person Eric O Lebigot    schedule 09.05.2011
comment
Извините, мне действительно не нужна сумма, это просто часть глупого примера. - person Fred Foo; 09.05.2011
comment
Я думаю, что строка примера #silly означает, что ОП ищет общее решение. - person JoshAdel; 09.05.2011
comment
@larsmans и JoshAdel: да, я добавлял общий случай, пока вы писали комментарии. :) - person Eric O Lebigot; 09.05.2011
comment
То, что заменяет sum, должно ли оно возвращать скаляр? - person David Heffernan; 09.05.2011
comment
@David: функция может, например, возвращать список; результатом в этом случае является полный массив NumPy правильной формы. - person Eric O Lebigot; 09.05.2011

Это должно быть что-то предоставленное numpy? Потому что я просто вижу понимание списка

[action_to_apply(row) for row in X]
person Prashant Kumar    schedule 09.05.2011
comment
Это очень похоже на то, что у меня сейчас. Я надеялся опустить петлю до уровня C. - person Fred Foo; 10.05.2011

Вот еще один пример, в котором учитываются тип и размер результата:

numpy.fromiter((your_func(row) for row in X), dtype=bool, count=len(X))

Несмотря на то, что цикл не является циклом C, установка типа и размера результата может помочь ускорить процесс.

person Eric O Lebigot    schedule 10.05.2011