- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试写一个TDMA algorithm在 nopython 模式下使用 numba。这是我的代码:
@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语言实现三对角矩阵算法的代码呢?
最佳答案
问题是您有二维数组,但对它们进行索引和分配就像它们是一维数组一样。因此,您可以在将它们传递给 numba 函数之前对它们进行 ravel()
操作。我不确定这是否真的正确 - 但出于这个答案的目的,我假设它是正确的。
此外,您也不需要复制 a
和 c
,因为您不修改它们,实际上只需要复制 b 的第一个元素
和 d
。
因此,工作函数可能如下所示:
import numba as nb
import numpy as np
@nb.njit
def TDMA(a,b,c,d):
n = len(d)
x = np.zeros(n)
bc = np.zeros(len(b))
bc[0] = b[0]
dc = np.zeros(len(d))
dc[0] = d[0]
for i in range(1, n):
w = a[i - 1] / bc[i - 1]
bc[i] = b[i] - w * c[i - 1]
dc[i] = d[i] - w * dc[i - 1]
x[n - 1] = dc[n - 1] / bc[n - 1]
for k in range(n - 2, -1, -1):
x[k] = (dc[k] - c[k] * x[k + 1]) / bc[k]
return x
你这样调用它:
TDMA(a.ravel(), b.ravel(), c.ravel(), B.ravel())
因为我使用了 ravel()
,所以结果与 np.linalg.solve
的形状不同:
by default solver, x1 = [[ 3.05427975]
[-0.13569937]
[-0.18789144]
[ 4.03757829]]
by TDMA, x2 = [ 3.05427975 -0.13569937 -0.18789144 4.03757829]
但是,我真的不会重新实现 NumPy 函数,除非您可以利用数据中 NumPy 函数不知道的某些结构。 NumPy 是一个高性能库,它已经使用了真正经过微调的实现,因此,对于极小的数据集,或者您可以利用有关数据的一些事实(允许性能极高的算法),随意重新实现可能会更快)。
我不得不承认我不懂“三对角矩阵算法”,但我知道一些BLAS libraries (通常令人难以置信的快速数学库)实现它。 NumPy 使用 BLAS。
然而,SciPy 为特殊矩阵类型提供了一些(非常快的)特殊线性代数求解器:
inv(a[, overwrite_a, check_finite])
Compute the inverse of a matrix.solve(a, b[, sym_pos, lower, overwrite_a, …])
Solves the linear equation set a * x = b for the unknown x for square a matrix.solve_banded(l_and_u, ab, b[, overwrite_ab, …])
Solve the equation a x = b for x, assuming a is banded matrix.solveh_banded(ab, b[, overwrite_ab, …])
Solve equation a x = b.solve_circulant(c, b[, singular, tol, …])
Solve C x = b for x, where C is a circulant matrix.solve_triangular(a, b[, trans, lower, …])
Solve the equation a x = b for x, assuming a is a triangular matrix.solve_toeplitz(c_or_cr, b[, check_finite])
Solve a Toeplitz system using Levinson Recursion[...]
关于map
的问题:目前官方list of supported built-in functions不包括 map
。所以你不能在Numbas nopython模式下使用map
。
关于python - Numba nopython 模式的三对角矩阵算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55330433/
我想将一个类对象传递给一个函数。我可以让它工作,但我想知道是否有我可以分配的类型?我有一个我正在尝试做的“最小”示例。 spec = [("a", float64),("b",float64)] @j
我有一个简单的函数来对扑克手牌进行排序(手牌是字符串)。 我用 rA,rB = rank(a),rank(b) 调用它,这是我的实现。没有 @jit(nopython=True) 也能很好地工作,但是
我在这里有一个简单的例子来帮助我理解使用 numba 和 cython。我是 numba 和 cython 的新手。我已经尽力结合所有技巧来使 numba 更快,并且在某种程度上,cython 也是如
我正在使用 numbas @jit 装饰器在 python 中添加两个 numpy 数组。如果我使用 @jit 与 python 相比,性能是如此之高。 然而,即使我传入 @numba.jit(nop
我需要为通用指标构建相异矩阵。由于我需要算法快速运行,所以我在 nopython 模式下使用了 numba 0.35。这是我的代码 import numpy as np from numba impo
Numba Cuda 有 syncthreads() 来同步一个 block 中的所有线程。如何在不退出当前内核的情况下同步网格中的所有 block ? 在 C-Cuda 中有一个 cooperati
有人尝试在Google合作伙伴中使用numba吗?我只是不知道如何在此环境中进行设置。 此刻,我陷入了错误library nvvm not found。 最佳答案 将此代码复制到单元格中。这个对我有用
我想编写一个函数,它既可以作为 jitted 函数运行,也可以作为普通 python 或对象模式 numba 运行,具体取决于 numba 是否能够进行类型推断。我实际上更喜欢普通的 python,但
我有一个非常简单的问题我无法解决。 我正在使用 Numba 和 Cuda。我有一个列表 T=[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0] 我想要一个包含列表元素的元组,如
我正在测试一些采用 numpy 数组的函数的 numba 性能,并比较: import numpy as np from numba import jit, vectorize, float64 im
我正在使用 Scipy 的 interpolate.interp1d 在 Python3 中插入一维数组。我想将它与 numba 一起使用,但不支持 scipy 和此功能。是否有 numba 支持
我是 Numba 的新手,我正在尝试使用 Numba(版本 0.54.1)在 Python 中实现旧的 Fortran 代码,但是当我添加 parallel = True 时,程序实际上变慢了.我的程
我需要在 Python 中创建一个位数组。到目前为止,我发现可以使用 bitarray 生成非常节省内存的数组。模块。 然而,我的最终目的是使用来自Numba 的@vectorize 装饰器。 . N
我认为这是一个简单的问题,但我发现 numba 文档缺乏关于如何将字符串类型与 numpy 数组和字典一起使用的信息。我有一个我想使用 numba 的函数,它需要一个邮政编码列表,然后是一个映射邮政编
假设我有两个功能 def my_sub1(a): return a + 2 def my_main(a): a += 1 b = mysub1(a) return b
在以下用于逻辑比较的 numba 编译函数中,性能下降的原因可能是什么: from numba import njit t = (True, 'and_', False) #@njit(boolean
我的代码使用如下列表的笛卡尔积: import itertools cartesian_product = itertools.product(list('ABCDEF'), repeat=n) n可
我正在使用 Numba(版本 0.37.0)来优化 GPU 代码。我想使用组合矢量化函数(使用 Numba 的 @vectorize 装饰器)。 导入和数据: import numpy as np f
我想知道在 numba 函数中计算两个列表的交集的最快方法。只是为了澄清:两个列表的交集示例: Input : lst1 = [15, 9, 10, 56, 23, 78, 5, 4, 9] lst2
我正在使用 Numba 非 python 模式和一些 NumPy 函数。 @njit def invert(W, copy=True): ''' Inverts elementwise
我是一名优秀的程序员,十分优秀!