我尝试使用线性函数进行数据转换(例如米到英尺)。
我试图找到一种方法来构建一个返回反函数的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
)。
答案 0 :(得分:4)
首先,最好使用def ...
语句而不是lambda
来定义命名函数。有关更多详细信息,请查看this SO问题及其答案。但如果我理解你想要实现的目标,那么将线性函数定义为一个类可能会更好(见下文)。
linear function的反转:
由:
给出
并且取决于斜率a
和拦截b
。这样做的一个重要结果是您需要知道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
这只是两种做法,两者都没有按要求使用lambda
。但是我建议不要使用lambda
来执行此类操作。
答案 1 :(得分:0)
opposite = lambda f : (lambda x: x*x*1/f(x))
完美的工作
答案 2 :(得分:0)
我同意接受的答案:由于池lambda
表达式的池回溯和字符串表示,一般不建议使用lambda
。
但是在我看来,lambda
在线性函数逆的情况下仍然有用。但是,如果函数变得复杂,我仍然更喜欢def
语句。
无论如何,以下是lambda
实施:
a = 2
b = 3
func = lambda x: a*x+b
inverse = lambda f: (lambda y: (y-b) / a)
func_inv = inverse(func)
# test
for x in range(10):
y = func(x)
x1 = func_inv(y)
print('For y=f(x)={}x+{} when x={},'.format(a, b, x), 'y={}'.format(y))
print("inverse function of y={} is {}\n".format(y, x1))
assert x == x1
输出:
For y=f(x)=2x+3 when x=0, y=3
inverse function of y=3 is 0.0
For y=f(x)=2x+3 when x=1, y=5
inverse function of y=5 is 1.0
For y=f(x)=2x+3 when x=2, y=7
inverse function of y=7 is 2.0
For y=f(x)=2x+3 when x=3, y=9
inverse function of y=9 is 3.0
For y=f(x)=2x+3 when x=4, y=11
inverse function of y=11 is 4.0
For y=f(x)=2x+3 when x=5, y=13
inverse function of y=13 is 5.0
For y=f(x)=2x+3 when x=6, y=15
inverse function of y=15 is 6.0
For y=f(x)=2x+3 when x=7, y=17
inverse function of y=17 is 7.0
For y=f(x)=2x+3 when x=8, y=19
inverse function of y=19 is 8.0
For y=f(x)=2x+3 when x=9, y=21
inverse function of y=21 is 9.0