NumPy ndarrays: построчное и столбцовое операции - PullRequest
9 голосов
/ 13 октября 2011

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

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

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

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

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

1 Ответ

14 голосов
/ 13 октября 2011

Во-первых, многие функции 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...