Numba nopython模式下@jit修饰函数触发exception_match类TypingError
报错触发原因
- Numba的
nopython模式对异常匹配的支持存在限制,官方明确说明该模式下仅支持捕获基类Exception,你代码中使用except ValueError捕获特定异常类的写法不被支持,是触发本次TypingError的直接原因。 - 额外的兼容隐患:代码中使用的
np.int已在NumPy 1.20及以上版本被废弃,np.mat也属于Numba支持度较低的接口,即使解决了异常问题后续也可能触发其他报错。
解决方法
按照以下步骤修改代码即可正常运行:
- 调整异常捕获逻辑:要么把
except ValueError改成except Exception,要么直接去掉try-except块,让numba在参数类型不匹配时自动抛错即可,效果和自定义捕获一致。 - 替换废弃/低兼容接口:将
np.int替换为Python内置的int(),将np.mat替换为np.array,同时将函数内抛出的TypeError改为基类Exception,适配nopython模式的异常规则。
修改后的可运行代码如下:
import numpy as np from math import factorial from numba import jit import pandas as pd @jit(nopython=True) def savitzky_golay(y, window_size, order, deriv=0, rate=1): window_size = np.abs(int(window_size)) order = np.abs(int(order)) if window_size % 2 != 1 or window_size < 1: raise Exception("window_size size must be a positive odd number") if window_size < order + 2: raise Exception("window_size is too small for the polynomials order") order_range = range(order+1) half_window = (window_size -1) // 2 b = np.array([[k**i for i in order_range] for k in range(-half_window, half_window+1)]) m = np.linalg.pinv(b).A[deriv] * rate**deriv * factorial(deriv) firstvals = y[0] - np.abs( y[1:half_window+1][::-1] - y[0] ) lastvals = y[-1] + np.abs(y[-half_window-1:-1][::-1] - y[-1]) y = np.concatenate((firstvals, y, lastvals)) return np.convolve( m[::-1], y, mode='valid') yaw = np.array(pd.read_csv(r'D:\datasets\df.csv')['yaw']) sg_yaw = savitzky_golay(yaw , window_size =3 , order = 1, deriv=0, rate=1)
内容的提问来源于stack exchange,提问作者Peacepieceonepiece
相关产品推荐
相关产品推荐

