Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Numpy Numba:检测到从nopython编译路径返回到对象模式编译路径_Numpy_Scipy_Numba - Fatal编程技术网

Numpy Numba:检测到从nopython编译路径返回到对象模式编译路径

Numpy Numba:检测到从nopython编译路径返回到对象模式编译路径,numpy,scipy,numba,Numpy,Scipy,Numba,我正在尝试用numba@jit编译python函数。在参数列表中,N1、N2、N3是整数,FX、FY、FZ是浮点64数据类型的numpy矩阵,inx,…,ground是具有int64数据类型的numpy数组,inb、res具有int64数据类型。在下面的函数中,spdiags、lil_矩阵、csx_矩阵来自scipy.sparse库 @jit def ThreeDChannel_Differentiate1(N1,N2,N3,FX,FY,FZ,

我正在尝试用numba@jit编译python函数。在参数列表中,N1、N2、N3是整数,FX、FY、FZ是浮点64数据类型的numpy矩阵,inx,…,ground是具有int64数据类型的numpy数组,inb、res具有int64数据类型。在下面的函数中,spdiags、lil_矩阵、csx_矩阵来自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
@jit
def三通道1(N1、N2、N3、FX、FY、FZ、,
inx,iny,inz,A0,AN,AS,AE,AW,AA,AG,东部,
西、北、南、空中、地面、inb、res):
数据=np.零((7,(N1*N2*(N3-2)))
diags=np.数组([-N1*(N3-2),-N1,-1,0,1,N1,N1*(N3-2)])
M=spdiags(数据、诊断、N1*N2*(N3-2)、N1*N2*(N3-2))
#M=sp.csc_矩阵(M)
M=sp.lil_矩阵(M)
对于inz-1中的k:
对于inx中的j:
对于iny的我:
FY0=FY[i,j,k+1]
FYN=FY[north[i],j,k+1]
FYS=FY[南[i],j,k+1]
FX0=FX[i,j,k+1]
FXE=FX[i,东[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,接地[k]]
如果inb==1:
M[A0[i,j,k],A0[i,j,k]]=1/FY0*(FYN/(FY0+FYN)-FYS/(FYS+FY0))
如果inb==2:
M[A0[i,j,k],A0[i,j,k]=1/FX0*(FXE/(FX0+FXE)-FXW/(FXW+FX0))
如果inb==3:
M[A0[i,j,k],A0[i,j,k]]=1/FZ0*(FZA/(FZ0+FZA)-FZG/(FZG+FZ0))
如果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)
如果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)
#考虑墙法向上的墙Dirichlet(无滑移)条件
如果inb==3:
如果AG.ravel(order='F')[A0[i,j,k]]>=0:
M[A0[i,j,k],股份公司ravel(order='F')[A0[i,j,k]]=-1/FZ0*FZ0/(FZ0+FZG)
其他:
M[A0[i,j,k],A0[i,j,k]]=1/FZ0*(FZA/(FZ0+FZA)-FZG/(FZG+FZ0)+\
FZ0/(FZG+FZ0))
如果AA.ravel(order='F')[A0[i,j,k]]
如果我调用上面的函数,我会得到下面的错误。另外,我得到了一个与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.
文件“”,第13行:
def三通道1(N1、N2、N3、FX、FY、FZ、,
对于inz-1中的k:
^
自身功能(如图所示)
/home/suraj/anaconda3/lib/python3.7/site packages/numba/compiler.py:734:numbadepreactionwarning:
检测到从nopython编译路径返回到对象模式编译路径,这是不推荐的行为。

多谢各位

您应该明确您正在使用的是
scipy.sparse
代码(
spdiags
lil_矩阵
csc_矩阵
)。你是对的,
numba
没有任何
nopython
代码;稀疏矩阵不是
numpy
子类。什么是
inz
?警告的位置可能不重要。这是某种有限差分或有限元刚度矩阵吗?当我在MATLAB中使用FEA时,我投入了大量精力对
coo_矩阵((数据,(行,列))进行“矢量化”评估
输入样式。
lil
针对元素分配进行了优化,但最好先将所有输入收集到
etc数组中。您可能可以使用
@njit
来实现这一点。不要要求
numba
创建/修改/访问稀疏矩阵。(稀疏
代码的一些关键部分是用cython编写的)是的,这是一个有限差分代码。spdiags,lil_matirx来自scipy.sparse库。inz是一个具有int64数据类型的一维数组。谢谢。