【问题标题】:Dictionary Calling Function for Each Key每个键的字典调用函数
【发布时间】:2021-02-04 15:37:59
【问题描述】:

我有以下代码,我在其中尝试根据分布类型和所述分布的参数构建一个随机数对象。该代码的工作原理是它生成一个包含 10,000 个均匀分布点的对象。

import numpy as np

rngSeed = 654  # Random seed for reproducibility
numSimulations = 10_000


def get_rand_unif(min_value, max_value, n_samples=1_000):
    """
    This function generates a random number [nd]array of size [n_samples]
    from a uniform distribution between the two input values
    [min_value, max_value)
    Args:
    - min_value (float)
    - max_value (float)
    - n_samples (int)
    Return:
    - Random number [nd]array of [n_samples] between this range (float)
    """
    return np.random.default_rng(rngSeed).uniform(min_value, max_value, n_samples)


def get_rand_norm(mean, std_dev, n_samples=1_000):
    """
    This function generates a random number [nd]array of size [n_samples]
    from a normal distribution with a mean of [mean] and a standard deviation
    of [std_dev].
    Args:
    - mean(float)
    - std_dev (float)
    - n_samples (int)
    Return:
    - Random number [nd]array of [n_samples] from a normal distribution (float)
    """
    return np.random.default_rng(rngSeed).normal(mean, std_dev, n_samples)


class InVar:
    def __init__(self, *parms):
        self.rndData = self.get_disto(*parms)

    def get_disto(self, *parms):
        distR = {
            "unif": get_rand_unif(parms[1], parms[2], numSimulations),
            "norm": get_rand_norm(parms[1], parms[2], numSimulations),
        }
        return distR.get(parms[0])

    def rand_data(self):
        return self.rndData

p1 = InVar("unif", 0, 1)

但是,当我调试代码时,我注意到正在为均匀 正态分布计算随机值。我想知道如何更改我的代码,以便只执行与被调用键对应的函数。虽然是轶事,但我担心如果我要引入需要两个以上参数的额外概率分布,我会遇到麻烦。

【问题讨论】:

  • 当你实例化你的类时,它的 init 会被执行。这会导致 get_distro 被调用,进而构建/计算 distR 字典。所述字典包含两个分布..

标签: python class dictionary


【解决方案1】:

我认为您正在寻找的简单解决方法是在构造字典之后调用函数。

def get_disto(self, *parms):
    distR = {
        "unif": get_rand_unif,
        "norm": get_rand_norm,
    }
    return distR.get(parms[0])(parms[1], parms[2], numSimulations)

更新:如果您想像以前一样单独调用函数,请使用 if/else 构造。

def get_disto(self, *parms):
    if parms[0] == "unif":
        return get_rand_unif(parms[1], parms[2], numSimulations)
    elif parms[0] == "norm":
        return get_rand_norm(parms[1], parms[2], numSimulations)
    else:
        raise Exception(f"Unrecognized distribution type: {parms[0]}")

【讨论】:

  • 谢谢@Andrew。这确实有效,但也限制了我使用两个参数的分布(我认为)。我想我可以尝试更改分布函数以接受可变数量的参数,并处理那里的逻辑。
  • @SimpleDavid 我添加了一个替代方案来支持您的新用例。您也可以将*parms[1:] 传入第一个选项,并将numSimulations 设为关键字参数,但这似乎会引发其他问题。
  • 另外,我认为您的代码不允许使用该类更改 n_samples。但我只是想回答你问的问题。
  • @SimpleDavid 请注意,我刚刚修复了一个错误 - 每个案例都调用了 get_rand_unif
猜你喜欢
  • 1970-01-01
  • 2019-09-24
  • 2021-08-19
  • 2018-10-21
  • 2019-10-05
  • 2020-06-19
  • 2021-10-02
  • 2021-03-14
  • 2011-08-16
相关资源
最近更新 更多