首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >numba :无法确定<class‘>函数’> python的Numba类型

numba :无法确定<class‘>函数’> python的Numba类型
EN

Stack Overflow用户
提问于 2021-06-09 19:51:54
回答 1查看 3.8K关注 0票数 1

这是我的密码。

代码语言:javascript
复制
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:无法确定函数的Numba类型.有人知道怎么修吗?非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-09 20:59:38

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

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

基本上,您的输入b_wif_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一起工作,您需要依赖类型列表,这有点麻烦。

代码语言:javascript
复制
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_nbf_wi_nb作为输入。

另一个问题是:函数stopF_w有两个"if“块。如果两个条件都不满足,则is可能不返回任何条件,这对于您的用例numba是不可接受的。因此,在取消对jit装饰器的注释的同时,您还需要将条件更改为if-else或if-elif-elif(视情况而定)。

代码语言:javascript
复制
@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应该能工作。

代码语言:javascript
复制
@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')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67910853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档