如何将参数数组广播到函数矩阵?
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
方法正是我要找的。
我确实希望这个功能是开箱即用的,我不必实现辅助函数,但我可以接受。
给定一个函数矩阵(每个函数可以有不同的逻辑)。形状是 [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
方法正是我要找的。
我确实希望这个功能是开箱即用的,我不必实现辅助函数,但我可以接受。