numpy - Numba:已检测到从 nopython 编译路径回退到对象模式编译路径
问题描述
我正在尝试使用 numba @jit 编译 python 函数。在参数列表中,N1,N2,N3 是整数,FX,FY,FZ 是具有 float64 数据类型的 numpy 矩阵,inx,...,ground 是具有 int64 数据类型的 numpy 数组,而 inb,res 具有 int64 数据类型。在下面的函数中,spdiags、lil_matrix、csx_matrix 来自 scipy.sparse 库。
@jit
def ThreeDChannel_Differentiate1(N1,N2,N3,FX,FY,FZ,
inx,iny,inz,A0,AN,AS,AE,AW,AA,AG,east,
west,north,south,air,ground,inb,res):
data = np.zeros((7,(N1*N2*(N3-2))))
diags = np.array([-N1*(N3-2), -N1, -1, 0, 1, N1, N1*(N3-2)])
M = spdiags(data, diags, N1*N2*(N3-2), N1*N2*(N3-2))
#M = sp.csc_matrix(M)
M = sp.lil_matrix(M)
for k in inz-1:
for j in inx:
for i in iny:
FY0 = FY[i,j,k+1]
FYN = FY[north[i],j,k+1]
FYS = FY[south[i],j,k+1]
FX0 = FX[i,j,k+1]
FXE = FX[i,east[j],k+1]
FXW = FX[i,west[j],k+1]
FZ0 = FZ[i,j,k+1]
FZA = FZ[i,j,air[k]]
FZG = FZ[i,j,ground[k]]
if inb == 1:
M[A0[i,j,k],A0[i,j,k]] = 1/FY0*(FYN/(FY0+FYN)-FYS/(FYS+FY0))
if inb == 2:
M[A0[i,j,k],A0[i,j,k]] = 1/FX0*(FXE/(FX0+FXE)-FXW/(FXW+FX0))
if inb == 3:
M[A0[i,j,k],A0[i,j,k]] = 1/FZ0*(FZA/(FZ0+FZA)-FZG/(FZG+FZ0))
if inb == 1:
M[A0[i,j,k],AN.ravel(order='F')[A0[i,j,k]]] = 1/FY0*FY0/(FY0+FYN)
M[A0[i,j,k],AS.ravel(order='F')[A0[i,j,k]]] = -1/FY0*FY0/(FY0+FYS)
if inb == 2:
M[A0[i,j,k],AE.ravel(order='F')[A0[i,j,k]]] = 1/FX0*FX0/(FX0+FXE)
M[A0[i,j,k],AW.ravel(order='F')[A0[i,j,k]]] = -1/FX0*FX0/(FX0+FXW)
# Account for wall Dirichlet (no-slip) condition in the wall-normal direction
if inb == 3:
if AG.ravel(order='F')[A0[i,j,k]] >= 0:
M[A0[i,j,k],AG.ravel(order='F')[A0[i,j,k]]] = -1/FZ0*FZ0/(FZ0+FZG)
else:
M[A0[i,j,k],A0[i,j,k]] = 1/FZ0*(FZA/(FZ0+FZA)-FZG/(FZG+FZ0) + \
FZ0/(FZG+FZ0))
if AA.ravel(order='F')[A0[i,j,k]] < N1*N2*(N3-2):
M[A0[i,j,k],AA.ravel(order='F')[A0[i,j,k]]] = 1/FZ0*FZ0/(FZ0+FZA)
else:
M[A0[i,j,k],A0[i,j,k]] = 1/FZ0*(FZA/(FZ0+FZA)-FZG/(FZG+FZ0) - \
FZ0/(FZA+FZ0))
M = sp.csc_matrix(M, copy=False)
return M
如果我调用上面的函数,我会得到以下错误。此外,我收到与 spdiag 对象相关的警告。我认为 Numba 不支持 scipy 对象。但以下警告与 for 循环有关。这个错误与什么有关?
File "<ipython-input-5-66816b729db2>", line 13:
def ThreeDChannel_Differentiate1(N1,N2,N3,FX,FY,FZ,
<source elided>
for k in inz-1:
^
self.func_ir.loc))
/home/suraj/anaconda3/lib/python3.7/site-packages/numba/compiler.py:734: NumbaDeprecationWarning:
Fall-back from the nopython compilation path to the object mode compilation path has been detected, this is deprecated behaviour.
谢谢你。
解决方案
推荐阅读
- r - 如何根据时间块创建唯一索引
- javascript - WordPress elementor 项目
- sql - 您可以通过多列在 SQL 2 表中进行 INNER JOIN 吗?
- reactjs - React:如何解决“{}”类型中缺少属性“孩子”但“道具”类型中需要?
- sql-server - 将货币更改为数字会破坏这种动态 SQL 方法
- c# - XMLSerializer 异常“存在错误反映字段”和“对于非数组类型,您可以使用以下属性:XmlAttribute, ..”
- qt - 如何在缩放视口时更新 QScrollArea 中的滚动条值以保持鼠标下的点居中?
- python - 为什么 Python 中的 Range() 方法有一个可选参数,而它的第二个参数不是可选的?
- html - 如何让图像显示与单元格边框齐平?
- .net - 如何在 Angular 中捕获 CCAvenue 支付响应