我正在将(数学上复杂/涉及但很少的操作)自制的经验分布类从C ++ / MATLAB(我同时拥有)移植到Python。
文件有大约1100行代码,其中包括注释和测试数据,其中包括一个
if __name__ == "__main__":
位于文件底部。
第83行具有函数声明:def cdf(self,x):
编译并运行良好的过程非常慢,所以我想使用@numba.jit(nopython=True)
进行编译以使其运行更快。
但是,编译在文件npts=len(x)
的函数的最早行之一(仅在它前面的注释)的第85行中终止。
该消息以:
结尾[1] During: typing of argument at
C:\Users\kdalbey\Canopy\scripts\empDist.py (85)
--%<-----------------------------------------------------------------
File "Canopy\scripts\empDist.py",line 85
This error may have been caused by the following argument(s):
- argument 0: cannot determine Numba type of <class '__main__.empDist'>
现在我确实在文件顶部做了一个import numpy as np
,但是为了使下面的消息更加清楚,我尝试将np
替换为numpy
。但是我可能错过了一些。
如果我使用npts=x.size
,则会收到相同的错误消息。
所以我尝试将x
输入为:
@numba.jit(nopython=True)
def cdf(self,x: numpy.ndarray(dtype=numpy.float64)):
我得到以下错误
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
C:\Users\kdalbey\Canopy\scripts\empDist.py in <module>()
15 np.set_printoptions(precision=16)
16
---> 17 class empDist:
18 def __init__(self,xdata):
19 npts=len(xdata)
C:\Users\kdalbey\Canopy\scripts\empDist.py in empDist()
81
82 @numba.jit(nopython=True)
---> 83 def cdf(self,x: np.ndarray(dtype=np.float64)):
84 # compute the value of cdf at vector of points x
85 npts = x.size
TypeError: Required argument 'shape' (pos 1) not found
但是我不知道1D numpy.ndarray
预先有多少个元素(是任意的)
我猜我也许可以做
@numba.jit(nopython=True)
def cdf(self,x: numpy.ndarray(shape=(),dtype=numpy.float64)):
它克服了这个错误,只能返回到
[1] During: typing of argument at
C:\Users\kdalbey\Canopy\scripts\empDist.py (85)
--%<-----------------------------------------------------------------
File "Canopy\scripts\empDist.py",line 85
This error may have been caused by the following argument(s):
- argument 0: cannot determine Numba type of <class '__main__.empDist'>
如果我做npts=int(x.size)
或npts=numpy.int32(x.size)
也是同样的错误,所以我发现问题出在x
上。