如何将参数数组广播到函数矩阵?

How to broadcast array of parameters onto matrix of functions?

给定一个函数矩阵(每个函数可以有不同的逻辑)。形状是 [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 的方法。意思是,广播是自动处理的,因为形状 [N, x][x] 是可广播的。但情况似乎并非如此(np.vectorize 只接受一个函数,而不是函数列表或矩阵)。

@mephisto 向我指出了另一个包含类似目标的问题:Numpy: Apply an array of functions to a same length 2d-array of value as if multiplying elementwise? (using a python function as an operator?)

不同的是,另一个问题是关于将函数数组广播到参数矩阵。 好的部分是,答案也适用于我们尝试将参数数组映射到函数矩阵的情况。

最终解决方案是np.vectorize

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

apply_vectorized 方法正是我要找的。 我确实希望这个功能是开箱即用的,我不必实现辅助函数,但我可以接受。