【问题标题】:Optimal multiple return values in scientific python科学python中的最佳多个返回值
【发布时间】:2013-07-15 10:10:09
【问题描述】:

我将 scipy/numpy 用于研究代码而不是 matlab。有一个缺陷,我经常遇到。我找到了一个变通的解决方案,但想检查最佳实践和更好的解决方案。想象一些数学优化:

def calculation (data, max_it=10000, tol = 1e-5):
    k = 0
    rmse = np.inf 
    while k < max_it and rmse > tol:
        #calc and modify data - rmse becomes smaller in each iteration
        k += 1
    return data

它工作正常,我将它嵌入到我的代码中,在多个位置,例如:

 import module
 d = module.calculation (data)

但有时我想检查进一步的见解并需要多个返回值。如果我只是附加多个返回值,我必须修改其他代码并解压缩第一个返回值。 这是我更喜欢 matlab 而不是 scipy 的少数情况之一。在 matlab 中,只有第一个返回值被评估,除非你明确要求其余的。

所以我对类似 matlab(= 最佳)的多个返回值的解决方法是 [模块的] 全局变量

def calculation (data, max_it=10000, tol = 1e-5):
    global k
    global rmse
    k = 0
    rmse = np.inf 
    while k < max_it and rmse > tol:
        #calc and modify data - rmse becomes smaller in each iteration
        k += 1
    return data

我的函数调用无需修改即可工作,如果我想在 ipython 中验证某些内容,Iset 一些全局变量 reload(module) 并使用 module.rmse 检查洞察力。

但我也可以从一开始就想象一个面向对象的方法,或者使用 pdb,或者使用其他 ipython 魔法

【问题讨论】:

    标签: python numpy scipy ipython


    【解决方案1】:

    您可以指定在调用calculation 时使用info=True 参数返回更多信息。这是np.unique(带有return_inverse和return_index参数)和scipy.optimize.leastsq(带有full_output参数)所采用的方法:

    def calculation(data, max_it=10000, tol = 1e-5, info=False):
        k = 0
        rmse = np.inf 
        while k < max_it and rmse > tol:
            #calc and modify data - rmse becomes smaller in each iteration
            k += 1
        if info:
            return data, k, rmse
        else:
            return data
    

    或者,您可以在 calculation 函数上分配其他属性:

    def calculation(data, max_it=10000, tol = 1e-5):
        k = 0
        rmse = np.inf 
        while k < max_it and rmse > tol:
            #calc and modify data - rmse becomes smaller in each iteration
            k += 1
        calculation.k = k
        calculation.rmse = rmse
        return data
    

    添加的信息可以通过

    访问
    import module
    d = module.calculation(data)
    rmse = module.calculation.rmse
    

    请注意,如果calculation 从多个线程同时运行,后一种方法将无法正常工作...

    在 CPython 中(由于 GIL),在任何给定时间只能执行一个线程,因此在多个线程中运行 calculation 几乎没有吸引力。但谁知道呢?可能有一些情况需要在小范围内使用线程,例如在 GUI 中。在那里,访问calculation.k 或calculation.rmse 可能会返回不正确的值。

    此外,Python 的禅宗说:“显式胜于隐式”。

    所以我会推荐第一种方法而不是第二种方法。

    【讨论】:

    • 你的两种方法都比我做的好!第二种方法是对我的解决方法的增强(如果模块中有多个功能,可以清楚地识别 rmse),您的第一种方法非常简单,我想知道为什么我没有想到它。虽然有点冗长,但无疑是任何“永久”信息的最佳选择。
    猜你喜欢
    • 2015-09-01
    • 2018-11-01
    • 2013-05-12
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 2010-09-26
    • 1970-01-01
    相关资源
    最近更新 更多