Numba签名报错问题:带签名的njit并行函数运行报错如何修正?
修正Numba签名的TypingError问题
你的问题出在签名和实际输入的类型不匹配,加上未明确指定返回类型,导致Numba无法正确推断类型。具体修正方案如下:
错误原因拆解
- 你输入的
z是1×2的二维数组,但签名里写的float64[::1]是一维数组类型,类型不匹配直接触发报错。 - 原签名仅定义了输入类型,未指定返回类型,在启用
parallel=True时,Numba需要明确的输入输出类型签名才能正常编译。
修正后的代码
import numba as nb import numpy as np @nb.njit('(float64[:,::1], float64[:,::1], float64[:,::1]) -> float64[::1]', parallel=True) def jacobian_matrix(a, b, z): n, m = a.shape assert n == m and z.shape == (1,m) jacob = np.empty((n, n)) for i in nb.prange(n): jacob[i,:] = a[i,:] - b[i,:] + z return np.mean(jacob,axis=0)
关键修改说明
- 将
z的签名从float64[::1]改为float64[:,::1],匹配你实际传入的二维(1,m)数组类型。 - 添加
-> float64[::1]明确返回类型:np.mean(jacob, axis=0)输出的是一维数组,对应签名里的一维连续数组类型。
可选简化方案
如果你的业务场景允许,也可以将输入的z从(1,2)的二维数组改成(2,)的一维数组,此时保持z的签名为float64[::1],同时把代码里的assert z.shape == (1,m)改成assert z.shape == (m,),同样能解决问题。
内容的提问来源于stack exchange,提问作者Zuba Tupaki
相关产品推荐
相关产品推荐

