Python 如何使用隐式方法的numpy快速编写循环

Python 如何使用隐式方法的numpy快速编写循环,python,numpy,numeric,Python,Numpy,Numeric,Numpy非常适合通过矢量化加速代码。然而,例如,当执行隐式迭代方程求解方法时,如数组的then元素n+1依赖于n第一个元素,从而阻止矢量化 我实现了gauss seidel,如下所示: def gausseidel(A,b,x0,tol=1e-10): n=len(A) x=np.拷贝(x0) k=0 虽然(正确): 印刷品(k) 对于范围(n)中的i: x[i]=(b[i]-np.delete(A[i],i)@np.delete(x,i))/A[i,i] 如果最大值(abs(x-x0))

Numpy非常适合通过矢量化加速代码。然而,例如,当执行隐式迭代方程求解方法时,如数组的then元素
n+1
依赖于
n
第一个元素,从而阻止矢量化

我实现了gauss seidel,如下所示:

def gausseidel(A,b,x0,tol=1e-10):
n=len(A)
x=np.拷贝(x0)
k=0
虽然(正确):
印刷品(k)
对于范围(n)中的i:
x[i]=(b[i]-np.delete(A[i],i)@np.delete(x,i))/A[i,i]
如果最大值(abs(x-x0))
这种方法比显式方法慢,比如雅可比方法

def jacobi(A,b,x0,tol=1e-10):
n=len(A)
M=np.副本(A)
DInv=np.零((n,n))
k=0
对于范围(n)中的i:
DInv[i,i]=1/M[i,i]
M[i,i]=0
虽然(正确):
x=DInv@(b-M@x0)
如果最大值(abs(x-x0))

据我所知,在这里不可能消除for循环,但这是一种加速它的方法吗?

某种可能有所帮助的方法是将if测试移到下面的循环之外

        s = b[i]
        for j in range(n):
            if i == j:
                continue
            s -= A[i, j] * x[j]

如果避免了测试,则使用这种方法


另一件需要尝试的事情是这个包,它可以动态编译代码,而无需外部编译步骤的开销。

您可以为
循环对内部
进行矢量化。。。这实际上是一个省略第i个元素的点积。。。因此,请使用完整的圆点产品,并根据需要进行调整。谢谢。我已经编辑了代码,这对您有所帮助,但主要问题仍然存在,因为您需要添加与您相关的示例数据。A,b,x0的数组形状是什么?numpy矢量化的目的是将循环移动到编译代码中-在整个数组方法中。前面我建议使用点积并调整以删除内部循环。。。使用
numpy.delete
执行此操作不是一个好方法,因为它会导致复制。
        s = b[i] + A[i, i] * x[i]
        for j in range(n):
            s -= A[i, j] * x[j]