我将 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 中验证某些内容,请设置一些变量 global reload(module)并使用module.rmse检查洞察力。
但我也可以从一开始就想象一个面向对象的方法,或者使用 pdb,或者使用其他 ipython 魔法