Для массива, который имеет много строк и несколько столбцов, простая итерация столбца должна быть эффективной по времени:
In [783]: funcs = [lambda x: x+1, lambda x: x+2, lambda x: x+3]
In [784]: arr = np.arange(12).reshape(4,3)
In [785]: for i in range(3):
...: arr[:,i] = funcs[i](arr[:,i])
...:
In [786]: arr
Out[786]:
array([[ 1, 3, 5],
[ 4, 6, 8],
[ 7, 9, 11],
[10, 12, 14]])
Если функции работают с входными данными 1d-массива, нет необходимости в np.vectorize
(np.vectorize
, как правило, медленнее, чем обычная итерация в любом случае.) Также для такой итерации нет необходимости заключать список функций в массив. В списках быстрее выполнять итерации.
Изменение индексированной итерации:
In [787]: for f, col in zip(funcs, arr.T):
...: col[:] = f(col)
...:
In [788]: arr
Out[788]:
array([[ 2, 5, 8],
[ 5, 8, 11],
[ 8, 11, 14],
[11, 14, 17]])
Здесь я использую arr.T
, поэтому итерация выполняется по столбцам arr
, а не по строкам.
Общее замечание: несколько итераций для сложной задачи - это очень хороший стиль numpy
. Многие итерации простых задач выполняются медленно, и, по возможности, их следует выполнять в скомпилированном коде.