Как транслировать массив параметров на матрицу функций? - PullRequest
0 голосов
/ 22 января 2020

Дана матрица функций (каждая функция может иметь различный лог c). Форма имеет вид [N, x].

matrix_of_functions = [
    [fun11, fun12, fun13],
    [fun21, fun22, fun23],
    ...
    [funN1, funN2, funN3]
]

Также имеется массив параметров с формой [x].

array_of_parameters = [param1, param2, param3]

Этот размер имеет такой же размер x. Параметры должны транслироваться по этому измерению, и должна применяться функция.

Поэтому результирующая матрица (должна быть массивом numpy в конце):

matrix_of_results = [
    [fun11(param1), fun12(param2), fun13(param3)],
    [fun21(param1), fun22(param2), fun23(param3)],
    ...
    [funN1(param1), funN2(param2), funN3(param3)]
]

Такое ощущение, что должен быть красивый способ сделать это, но как?

Очевидно, это можно сделать так:

matrix_of_results = []
for array_of_functions in matrix_of_functions:
    array_of_results = [fun(param) for fun, param in zip(array_of_functions, array_of_parameters])]:
    matrix_of_results.append(array_of_results )

Или более компактно:

matrix_of_results = [
    [fun(param) for fun, param in zip(array_of_functions, array_of_parameters])] 
    for array_of_functions in matrix_of_functions
]

Или многими другими способами ... но это не читабельно и не прекрасно.

Я действительно надеялся, что есть способ numpy i sh. Это означает, что трансляция выполняется автоматически, поскольку формы [N, x] и [x] могут быть переданы. Но, похоже, это не так (np.vectorize принимает только одну функцию, а не список или матрицу функций).

1 Ответ

0 голосов
/ 23 января 2020

@ mephisto указал мне на другой вопрос, который содержал похожую цель: Numpy: применить массив функций к двумерному массиву значений одинаковой длины, как если бы они умножались поэлементно? (используя функцию python в качестве оператора?)

Разница в том, что другой вопрос был о передаче массива функций в матрицу параметров. Хорошая часть заключается в том, что ответ также применим в случае, когда мы пытаемся отобразить массив параметров в матрицу функций.

В конце концов, решение было np.vectorize:

apply_vectorized = np.vectorize(lambda f, x: f(x))
matrix_of_results = apply_vectorized(matrix_of_functions, array_of_parameters)

Метод apply_vectorized - это именно то, что я искал. Я действительно надеялся, что эта функциональность выйдет из коробки, и мне не придется реализовывать вспомогательную функцию, но я могу жить с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...