我正在尝试使用线性函数进行数据转换(比如米到英尺)。
我试图找到一种方法来构建一个lambda函数,它返回反函数,另一个lambda函数返回这些函数的组合
inches_to_meters=lambda x:x*0.0254
inches_to_feets=lambda x:x*(1/12)
miles_to_feets=lambda x:x*5280
composition=lambda x,y,z: lambda x,y: x(y(z))
opposite=lambda x: 1/x
meters_to_inches=opposite(inches_to_meters)
miles_to_inches = composition(feets_to_inches, miles_to_feets)
print(meters_to_inches(10))
我怎样才能做相反的函数(
F^-1(x)
)?(例如:
y=x/12
,然后12*y=x
,相反的是:12*x=y
)。 最佳答案
首先,最好使用def ...
语句而不是lambda
来定义命名函数。请查看this以便问题及其答案了解更多详细信息但如果我正确地理解了您想要实现的目标,那么最好将线性函数定义为一个类(见下文)。
linear function的倒数:
给出者:
取决于斜率和截距。这样做的一个重要结果是,您需要同时知道a
和b
才能以函数形式定义它的逆。
例如,在python中,如果将一类线性函数和逆函数定义为其方法之一,则可以实现此目的:
class f_lin:
def __init__(self, a, b=0):
self.a = float(a)
self.b = b
def __call__(self, x):
return self.a * x + self.b
def inv(self, y):
return (y - self.b) / self.a
现在您可以定义:
inches_to_meters = f_lin(0.0254)
像这样使用它:
inches_to_meters(10)
Out[38]: 0.254
inches_to_meters.inv(0.254)
Out[39]: 10.0
inches_to_meters.inv(inches_to_meters(10))
Out[40]: 10.0
或者,也可以为逆函数创建新对象,因为线性函数的逆函数仍然是线性函数:
class f_lin:
def __init__(self, a, b=0):
self.a = float(a)
self.b = b
def __call__(self, x):
return self.a * x + self.b
def get_inverse(self):
return self.__class__(1/self.a, - self.b/self.a)
然后你可以这样定义反函数:
inches_to_meters = f_lin(0.0254)
meters_to_inches = inches_to_meters.get_inverse()
现在,线性函数及其逆函数都作为对象:
inches_to_meters(10)
Out[43]: 0.254
meters_to_inches(0.254)
Out[44]: 10.0
inches_to_meters(meters_to_inches(10))
Out[45]: 10.0
这只是两种方法,都没有按要求使用
a
。但是我建议不要用b
来做这些事情。