Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.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
numba:无法确定<;的numba类型;类别';功能'&燃气轮机;python_Python_Numba - Fatal编程技术网

numba:无法确定<;的numba类型;类别';功能'&燃气轮机;python

numba:无法确定<;的numba类型;类别';功能'&燃气轮机;python,python,numba,Python,Numba,这是我的密码 from numba import jit import numpy as np import time from pandas.core.common import flatten from numba import njit b_wi=[[1,2,3,4],[6,7,8,9,10,11]] #b_wi is a subset of x f_wi=[[5,4,2,7,9],[5,4,3,7,2,3,4]] # @jit(nopython=True) def stopF_w(x

这是我的密码

from numba import jit
import numpy as np
import time

from pandas.core.common import flatten
from numba import njit
b_wi=[[1,2,3,4],[6,7,8,9,10,11]] #b_wi is a subset of x
f_wi=[[5,4,2,7,9],[5,4,3,7,2,3,4]]

# @jit(nopython=True)
def stopF_w(x,b_wi,f,di):
    if di=='left':
        return f[np.searchsorted(-b_wi,-x,side='left')]
    if di=='right':
        return f[np.searchsorted( b_wi, x,side='right')]
    # this f :need to be an element in f_nslst
    #b_wi :need to be an element in b_wilst

@njit(parallel=True)
def averageF_w(x,b_wilst,f_nslst,di):
    a=np.zeros(x.shape[0])
    for b_wi,f in zip(b_wilst,f_nslst):
        a[:]  += stopF_w(x,np.asarray(b_wi),np.asarray(f),di)
    return a

intval= np.unique(list(flatten(b_wi)))
x=np.concatenate(([-10000],(intval[:-1]+intval[1:])/2,[10000]))  #b_wi is a subset of x. That is why I can use this.
averageF_w(x,b_wi,f_wi,'right')
它引发错误:TypingError:无法确定的类型。 有人知道怎么修吗?
非常感谢。

有几个问题需要处理:首先,您已经注释掉了第一个函数的
@jit
装饰器
stopF\u w

如果取消注释,将解决当前错误。不幸的是,您将立即遇到其他几个错误。如果您的numba版本是最新的,您将看到与“反射列表”相关的错误

基本上,您的输入
b_wi
f_wi
是可变长度列表的列表,不能转换为统一的numpy数组。例如:如果不是
[[1,2,3,4],[6,7,8,9,10,11]
,而是
b_-wi
类似于
[[1,2,3,4,6],[7,8,9,10,11]
(可以轻松转换为形状数组(2,5)),那么它就可以毫无问题地工作。要让可变长度列表与numba一起工作,你需要依赖a,这有点麻烦

from numba import jit
import numpy as np
import time

from pandas.core.common import flatten
from numba import njit

from numba.typed import List

b_wi=[[1,2,3,4], [6,7,8,9,10,11]]
f_wi=[[5,4,2,7,9], [5,4,3,7,2,3,4]]

###########################
# Create typed Lists
###########################
b_wi_nb = List()
for i in range(len(b_wi)):
    b = List()
    for j in range(len(b_wi[i])):
        b.append(b_wi[i][j])
    b_wi_nb.append(b)

f_wi_nb = List()
for i in range(len(f_wi)):
    f = List()
    for j in range(len(f_wi[i])):
        f.append(f_wi[i][j])
    f_wi_nb.append(f)
稍后我们将使用
b_wi_nb
f_wi_nb
作为输入

另一个问题:函数
stopF_w
有两个“if”块。如果两个条件都不满足,is可能会返回None,这对于您的用例来说是numba不可接受的。因此,除了取消jit装饰器的注释外,您还需要将条件更改为if-else,或者if-else(如果适用)

@jit(nopython=True)
def stopF_w(x,b_wi,f,di):
    if di=='left':
        return f[np.searchsorted(-b_wi,-x,side='left')]
    else:
        return f[np.searchsorted( b_wi, x,side='right')]
在进行上述更改后,numba应该可以正常工作

@jit(nopython=True, parallel=True)
def averageF_w(x, b_wilst, f_nslst, di):
    a = np.zeros(x.shape[0])
    for b_wi, f in zip(b_wilst,f_nslst):
        a  += stopF_w(x, np.asarray(b_wi), np.asarray(f), di)
    return a

intval= np.unique(list(flatten(b_wi)))
x=np.concatenate(([-10000],(intval[:-1]+intval[1:])/2,[10000]))

##############################
# initial compiles
##############################
stopF_w(np.arange(1),np.arange(1),np.arange(1),'right')
averageF_w(np.arange(10),np.arange(6).reshape(2, 3),np.arange(6).reshape(2, 3),'right')
##############################



averageF_w(x, b_wi_nb, f_wi_nb,'right')

请只发布代码中绝对相关的部分。很抱歉,您认为哪部分不相关?非常感谢您的详细回答。问题是,输入b_wi和f_wi的长度是不同的。这就是为什么这个问题对我来说如此棘手。我曾考虑过使用多处理包。但我无法解决问题我在这个链接中尝试了你的解决方案。它现在起作用了!非常感谢!!!我还有一个问题。因为我需要使用list()传输列表。然后计算时间会因为转换而增加。你知道如何处理这个问题吗?当我在我的实际问题中尝试你的解决方案时,时间会增加很多,因为我的列表太长。不确定它是否有效,但你可以尝试安装以前版本的numba,这没有问题正常的列表列表。根据,似乎<0.44.0的版本可能会起作用。除此之外,是的,多进程池似乎是更合适的解决方案。在averageF_w内创建一个mp.Pool,并映射到stopF_w。但是,我无法在averageF_w内创建池,因为我需要'if name==“main”: