小编ama*_*rea的帖子

在Python中避免默认参数中的代码重复

考虑具有默认参数的典型函数:

def f(accuracy=1e-3, nstep=10):
    ...
Run Code Online (Sandbox Code Playgroud)

这很紧凑,易于理解.但是,如果我们有另一个功能g,将来电f,我们要传递的一些参数gf?这样做的一种自然方式是:

def g(accuracy=1e-3, nstep=10):
    f(accuracy, nstep)
    ...
Run Code Online (Sandbox Code Playgroud)

这种做法的问题在于可选参数的默认值会重复出现.通常在传播这样的默认参数时,需要在上部函数(g)中使用与下部函数(f)中相同的默认值,因此任何时候默认更改都f需要通过调用它的所有函数并更新默认值他们将传播给他们的任何论据f.

另一种方法是使用占位符参数,并在函数内填写其值:

def f(accuracy=None, nstep=None):
    if accuracy is None: accuracy = 1e-3
    if nstep is None: nstep=10
    ...
def g(accuracy=None, nstep=None):
    f(accuracy, nstep)
    ...
Run Code Online (Sandbox Code Playgroud)

现在调用函数不需要知道f默认值是什么.但是f界面现在有点麻烦,而且不太清楚.这是没有显式默认参数支持的语言中的典型方法,如fortran或javascript.但是如果一个人在python中以这种方式完成所有事情,那么就会丢掉大部分语言的默认参数支持.

有没有比这两个更好的方法?这样做的标准,pythonic方式是什么?

python default argument-passing

18
推荐指数
2
解决办法
840
查看次数

在numpy中解决大量小方程组

我有大量的小型线性方程组,我想使用 numpy 有效地解决它们。基本上,给定A[:,:,:]b[:,:],我希望找到x[:,:]给定的A[i,:,:].dot(x[i,:]) = b[i,:]。所以如果我不关心速度,我可以解决这个问题

for i in range(n):
    x[i,:] = np.linalg.solve(A[i,:,:],b[i,:])
Run Code Online (Sandbox Code Playgroud)

但是由于这涉及 python 中的显式循环,并且由于A通常具有类似 的形状(1000000,3,3),因此这种解决方案将非常缓慢。如果 numpy 不能做到这一点,我可以在 fortran 中执行此循环(即使用 f2py),但如果可能,我更愿意留在 python 中。

python numpy linear-algebra

6
推荐指数
2
解决办法
2600
查看次数

在scipy.sparse.linalg.cg中打印回调中的当前残差

我正在使用scipy.sparse.linalg.cg解决一个大的,稀疏的线性系统,并且它工作正常,除了我想添加进度报告,以便我可以在求解器工作时监视残差.我已设法设置回调,但我无法弄清楚如何从回调内部访问当前残差.当然,计算剩余是可能的,但这是一个相当繁重的操作,我想避免.我错过了什么,或者没有有效的方法来获取残差?

python linear-algebra scipy

3
推荐指数
1
解决办法
1454
查看次数