我使用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-like(=最佳)多个返回值的解决方案是[模块]的全局变量
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 检查洞察力。
但我也可以从一开始就想象出一个OO-aproach,或者使用pdb,或者使用其他ipython魔法
答案 0 :(得分:7)
您可以在调用info=True
时指定您希望使用calculation
参数返回更多信息。这是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的Zen说,“明确比隐含更好”。
所以我会推荐第一种方法。