【问题标题】:'Bijectively' apply list of functions to list of arguments'Bijectively' 将函数列表应用于参数列表
【发布时间】: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


【解决方案1】:

正如@hpaulj 在 cmets 中所述,解决方案是“打开”函数内的特定参数列表:

specmap = lambda fns, args: [fn(*arg) for fn, arg in zip(fns, args)]

同时将输入的集合列表保留为列表,而不是 *list 对象。

【讨论】:

    猜你喜欢
    • 2018-12-19
    • 2021-04-25
    • 2013-12-14
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 2015-07-29
    相关资源
    最近更新 更多