科学Python中的最佳多返回值

4

我在研究代码中使用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中验证一些东西,我会将一些变量设置为全局变量,然后使用reload(module)重新加载模块,并通过module.rmse来检查结果。
但是我也可以从一开始就采用面向对象的方法,或者使用pdb,或者使用其他ipython魔法。
1个回答

7
当调用"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.kcalculation.rmse可能会返回错误值。
此外,Python之禅说:“显式优于隐式”。
因此,我建议第一种方法胜过第二种方法。

你们两种方法都比我做的好!第二种方法是我解决问题的改进(在模块中有多个函数的情况下,可以清楚地识别rmse),你们的第一种方法非常简单,让我想知道为什么我没有想到。虽然有点啰嗦,但无疑是任何“永久”信息的最佳选择。 - user421929

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接