我有一个给定的函数
def unnorm(x, alpha, beta):
return (1 + alpha * x + beta * x ** 2)
然后,我对它进行集成以在一个范围内找到一个规范化常量,并将其转换为一个lambda函数,该函数的参数与unnorm
相同。现在,为了创建一个合适的对象,我将函数组合如下:
这很好,但是仍然存在重复和从全局命名空间中提取名称的情况。在
如何以更简洁的方式组合这两个函数,而不必重写参数?E、 g
def normalized(func, normalizer):
return func * normalizer
完整代码:
import sympy
import numpy as np
import inspect
def normalize_function(f, xmin, xmax):
"""
Normalizes function to PDF in the given range
"""
# Get function arguments
fx_args = inspect.getfullargspec(f).args
# Convert to symbolic notation
symbolic_args = sympy.symbols(fx_args)
# Find definite integral
fx_definite_integral = sympy.integrate(f(*symbolic_args), (symbolic_args[0], xmin, xmax))
# Convert to a normalization multiplication term, as a real function
N = sympy.lambdify(expr = 1 / fx_definite_integral, args = symbolic_args)
return N
def unnorm(x, alpha, beta):
return (1 + alpha * x + beta * x ** 2)
norm = normalize_function(unnorm, -1, 1)
# How do I condense this to a generic expression?
def normalized(x, alpha, beta):
return unnorm(x, alpha, beta) * norm(x, alpha, beta)
x = np.random.random(100)
print(normalized(x, alpha = 0.5, beta = 0.5))
我看不出你现在所做的有什么不对。但出于美观的目的,这里有一些功能最小的替代品。在
如果您想要一种真正可扩展的、函数式的方法,只需提取一次参数,这就可以:
^{pr2}$好吧,一种方法是使用修饰符为函数实现
*
等等:您需要为}等添加类似的定义。在
__add__
、__sub__
、__div__
添加类似的定义,可能还需要为反向方法{相关问题 更多 >
编程相关推荐