【发布时间】:2019-08-15 06:13:36
【问题描述】:
我正在尝试在 nopython 模式下使用 numba 编写 TDMA algorithm。这是我的代码:
@jit(nopython=True)
def TDMA(a,b,c,d):
n = len(d)
x = np.zeros(n)
w = np.zeros(n)
# ac, bc, cc, dc = map(np.copy, (a, b, c, d)) # copy arrays
ac = np.copy(a)
bc = np.copy(b)
cc = np.copy(c)
dc = np.copy(d)
for i in range(1,n):
w[i] = ac[i-1]/bc[i-1]
bc[i] = bc[i] - w[i]*cc[i-1]
dc[i] = dc[i] - w[i]*dc[i-1]
x[n-1] = dc[n-1]/bc[n-1]
for k in range(n-2,-1,-1):
x[k] = (dc[k]-cc[k]*x[k+1])/bc[k]
return np.array(x)
然后测试这个求解器:
A = np.array([[5, 2, 0, 0],[1, 5, 2, 0],[0, 1, 5, 2],[0, 0, 1, 5]],float)
B = np.array([[15],[2],[7],[20]],float)
a = A.diagonal(-1)
b = A.diagonal()
c = A.diagonal(1)
x1 = np.linalg.solve(A,B)
x2 = TDMA(a,b,c,B)
print('by default solver, x1 = ',x1)
print('by TDMA, x2 = ',x2)
但是,我的 TDMA 函数失败并显示 TypingError:
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Cannot resolve setitem: array(float64, 1d, C)[int64] = array(float64, 1d, C)
File "<ipython-input-20-e25cda7246bd>", line 16:
def TDMA(a,b,c,d):
<source elided>
x[n-1] = dc[n-1]/bc[n-1]
^
它与@jit 装饰器一起正常工作,但在nopython 模式下失败。我应该如何修改这个 TDMA 函数以使其与nopyhon 兼容?
我评论的那一行:
ac, bc, cc, dc = map(np.copy, (a, b, c, d)) # copy arrays
也不兼容nopython。 nopython模式下是否可以使用map功能?
我了解我的 TDMA 可能仍然很慢。那么有没有最快的使用python 3语言实现三对角矩阵算法的代码呢?
【问题讨论】:
标签: python python-3.x performance numpy numba