Как эффективно оценить весь список функций Python поэлементно? - PullRequest
0 голосов
/ 10 октября 2018

Допустим, у меня есть список из трех функций:

f_list = [f1,f2,f3]

и массив значений, где каждая функция должна быть оценена

values = numpy.array([1,2,3])

, так что я получаю f1 (1), f2 (2) и f3 (3).

Один из способов сделать это, конечно, циклически перебирать функции:

for i in range(3):
    print(f_list[i](values[i])

Есть ли более эффективный способ сделать это?Что-то похожее на операции с массивами, где я могу передать все значения одновременно, чтобы получить массив оценок функций?Насколько я знаю, я не могу хранить функции в массиве Numpy, я могу?

В моем случае у меня есть очень большой 2D-список функций интерполяции (или интерполяции) scipy (или вызываемых объектов), который занимает много времени для оценки при зацикливании по обеим осям.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Для произвольных функций Python цикл уровня Python неизбежен.Одним из способов является использование списка:

f_list = [f1,f2,f3]
values = np.array([1,2,3])
res = np.array([func(val) for func, val in zip(f_list, values)])

Помните, что NumPy не является функциональным инструментом более высокого порядка для преобразования обычных функций в векторизованные.Даже np.vectorize немного больше, чем цикл уровня Python.Чтобы векторизовать ваши вычисления, вам нужно будет рассмотреть каждую функцию по очереди и написать некоторую логику, если это действительно возможно векторизовать.

0 голосов
/ 10 октября 2018

Если они в порядке, этот код будет работать:

def a ( parameter ):
  print ( parameter )
def b ( parameter ):
  print ( parameter )
def c ( parameter ):
  print ( parameter )


f_list = [a, b, c]
v_list = [1, 2, 3]

for index, function in enumerate ( f_list ):
    function ( v_list [ index ] )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...