【发布时间】:2020-01-06 01:22:16
【问题描述】:
说,我在代码中定义了一些函数;让我们以两条不同的 PDF 曲线为例:
import numpy as np
# Gaussian 1
def fa(mu, sigsq, x):
return ((np.sqrt(2*np.pi*sigsq))**(-1)
* np.exp((-0.5 * (x - mu + 1)**2)/sigsq))
# Gaussian 2
def fb(nu, omsq, x):
return ((np.sqrt(2*np.pi*omsq))**(-1)
* np.exp(-(0.5 * (x - nu - 1)**2)/omsq))
...
fs = [fa, fb, ...]
将具有相同数量参数的函数列表应用于某些给定的函数很容易:
fmap = lambda fns, *args: map(lambda fn: fn(*args), fns)
multipeak_gauss = lambda x: sum(list(fmap(fs, 0., 1., x)))
现在让每个函数都有一个唯一的、不同大小的参数集:
import numpy as np
# Gaussian
def fa(mu, sigsq, x):
return ((np.sqrt(2*np.pi*sigsq))**(-1)
* np.exp((-0.5 * (x - mu + 1)**2)/sigsq))
# Maxwell-Boltzmann
def fb(a, x):
return (np.sqrt(2/np.pi)
* (x**2 / a**3)
* np.exp(-(x**2)/(2*a**2)))
...
fs = [fa, fb, ...]
ars = [[0., .1, 1.], [1., 1.], ...]
参数列表列表也可以是元组列表或任何此类列表。如何将每组参数一对一地传递给每个函数,而无需重写所有函数以接受列表?
迄今为止我的最佳猜测:
specmap = lambda fns, *args: [fn(arg) for fn, arg in zip(fns, *args)]
这段代码遇到了一个明显的问题,即它将一个列表传递给一个只需要普通参数的函数。直觉告诉我,我可以以某种方式进一步“解开”列表列表中的每个列表,例如
specmap = lambda fns, *args: [fn(ar for ar in arg) for fn, arg in zip(fns, *args)]
虽然上面的代码显然功能失调,我不知道它究竟是如何完成的。
【问题讨论】:
-
[fn(*args) for fn, args in zip(fnlist, argslist)]。将 args 元组保持在一起,直到传递给 fn, -
@hpaulj 宾果游戏!我不知道为什么我以前没有尝试过这种组合,它就像一个魅力。谢谢。
-
@hpaulj 请不要使用 cmets 写答案,而只是写一个简短的答案。
-
@Grismar,我在手机上写了这条评论。我的答案通常更长,并且包括工作代码的复制粘贴。
-
这解释了简洁性,但作为答案仍然会更好,因为现在需要等到其他人写下该答案(并且无缘无故地获得荣誉)或使用@AndriiKozytskyi决定回答自己的问题并接受答案。感谢您的意见,您的意见绝对正确,我只是指出问题现在仍未得到解答,因此您的贡献或多或少会丢失。
标签: python list function numpy lambda