And*_*egi 6 python numpy numba
I\xc2\xb4m 很难在我的函数中实现 numba。
\n基本上,如果尚未添加新数据,我想连接到具有 22 列的数组。如果没有旧数据,新数据应该成为二维数组。
\n该函数在没有装饰器的情况下也可以正常工作:
\n@jit(nopython=True)\ndef add(new,original=np.array([])):\n duplicate=True\n if original.size!=0:\n for raw in original:\n for ii in range(11,19):\n if raw[ii]!=new[ii]:\n duplicate=False\n if duplicate==False:\n res=np.zeros((original.shape[0]+1,22))\n res[:original.shape[0]]=original\n res[-1]=new\n return res\n else:\n return original\n else:\n res=np.zeros((1,22))\n res[0]=new\n return res\nRun Code Online (Sandbox Code Playgroud)\n另外,如果我删除代码的最后一部分:
\n else:\n res=np.zeros((1,22))\n res[0]=new\n return res\nRun Code Online (Sandbox Code Playgroud)\n它可以与 njit 一起使用
\n因此,如果我忽略这种情况,即还没有\xc2\xb4t 旧数据,那么一切都会好起来的。
\n仅供参考:我传入的数据是混合 float 和 np.nan。
\n有人有想法吗?\n提前非常感谢!
\n这是我的错误日志:
\n---------------------------------------------------------------------------\nTypingError Traceback (most recent call last)\n<ipython-input-255-d05a5f4ea944> in <module>()\n 19 return res\n 20 #add(a,np.array([b]))\n---> 21 add(a)\n\n2 frames\n/usr/local/lib/python3.7/dist-packages/numba/core/dispatcher.py in _compile_for_args(self, *args, **kws)\n 413 e.patch_message(msg)\n 414 \n--> 415 error_rewrite(e, \'typing\')\n 416 except errors.UnsupportedError as e:\n 417 # Something unsupported is present in the user code, add help info\n\n/usr/local/lib/python3.7/dist-packages/numba/core/dispatcher.py in error_rewrite(e, issue_type)\n 356 raise e\n 357 else:\n--> 358 reraise(type(e), e, None)\n 359 \n 360 argtypes = []\n\n/usr/local/lib/python3.7/dist-packages/numba/core/utils.py in reraise(tp, value, tb)\n 78 value = tp()\n 79 if value.__traceback__ is not tb:\n---> 80 raise value.with_traceback(tb)\n 81 raise value\n 82 \n\nTypingError: Failed in nopython mode pipeline (step: nopython frontend)\nNo implementation of function Function(<built-in function getitem>) found for signature:\n \n >>> getitem(float64, int64)\n \nThere are 22 candidate implementations:\n - Of which 22 did not match due to:\n Overload of function \'getitem\': File: <numerous>: Line N/A.\n With argument(s): \'(float64, int64)\':\n No match.\n\nDuring: typing of intrinsic-call at <ipython-input-255-d05a5f4ea944> (7)\n\nFile "<ipython-input-255-d05a5f4ea944>", line 7:\ndef add(new,original=np.array([])):\n <source elided>\n for ii in range(11,19):\n if raw[ii]!=new[ii]:\n ^\nRun Code Online (Sandbox Code Playgroud)\n更新:\n这是它应该如何工作的。该功能应涵盖三种主要情况
\n新数据的示例输入(一维数组):
\narray([9.0000000e+00, 0.0000000e+00, 1.0000000e+00, 0.0000000e+00,\n 0.0000000e+00, nan, 5.7300000e-01, 9.2605450e-01,\n 9.3171725e-01, 9.2039175e-01, 9.3450000e-01, 1.6491636e+09,\n 1.6494228e+09, 1.6496928e+09, 1.6497504e+09, 9.2377000e-01,\n 9.3738000e-01, 9.3038000e-01, 9.3450000e-01, nan,\n nan, nan])\nRun Code Online (Sandbox Code Playgroud)\n原始数据的示例输入(二维数组):
\narray([[4.00000000e+00, 0.00000000e+00, 1.00000000e+00, 0.00000000e+00,\n 0.00000000e+00, nan, 5.23000000e-01, 8.31589755e-01,\n 8.34804877e-01, 8.28374632e-01, 8.36090000e-01, 1.64938320e+09,\n 1.64966400e+09, 1.64968920e+09, 1.64975760e+09, 8.30750000e-01,\n 8.38020000e-01, 8.34290000e-01, 8.36090000e-01, nan,\n nan, nan]])\nRun Code Online (Sandbox Code Playgroud)\nadd(new)\nOutput:\n\narray([[9.0000000e+00, 0.0000000e+00, 1.0000000e+00, 0.0000000e+00,\n 0.0000000e+00, nan, 5.7300000e-01, 9.2605450e-01,\n 9.3171725e-01, 9.2039175e-01, 9.3450000e-01, 1.6491636e+09,\n 1.6494228e+09, 1.6496928e+09, 1.6497504e+09, 9.2377000e-01,\n 9.3738000e-01, 9.3038000e-01, 9.3450000e-01, nan,\n nan, nan]])\nRun Code Online (Sandbox Code Playgroud)\nadd(new,original)\nOutput:\narray([[4.00000000e+00, 0.00000000e+00, 1.00000000e+00, 0.00000000e+00,\n 0.00000000e+00, nan, 5.23000000e-01, 8.31589755e-01,\n 8.34804877e-01, 8.28374632e-01, 8.36090000e-01, 1.64938320e+09,\n 1.64966400e+09, 1.64968920e+09, 1.64975760e+09, 8.30750000e-01,\n 8.38020000e-01, 8.34290000e-01, 8.36090000e-01, nan,\n nan, nan],\n [9.00000000e+00, 0.00000000e+00, 1.00000000e+00, 0.00000000e+00,\n 0.00000000e+00, nan, 5.73000000e-01, 9.26054500e-01,\n 9.31717250e-01, 9.20391750e-01, 9.34500000e-01, 1.64916360e+09,\n 1.64942280e+09, 1.64969280e+09, 1.64975040e+09, 9.23770000e-01,\n 9.37380000e-01, 9.30380000e-01, 9.34500000e-01, nan,\n nan, nan]])\n\nRun Code Online (Sandbox Code Playgroud)\nadd(new,original)\nOutput:\n\narray([[9.0000000e+00, 0.0000000e+00, 1.0000000e+00, 0.0000000e+00,\n 0.0000000e+00, nan, 5.7300000e-01, 9.2605450e-01,\n 9.3171725e-01, 9.2039175e-01, 9.3450000e-01, 1.6491636e+09,\n 1.6494228e+09, 1.6496928e+09, 1.6497504e+09, 9.2377000e-01,\n 9.3738000e-01, 9.3038000e-01, 9.3450000e-01, nan,\n nan, nan]])\nRun Code Online (Sandbox Code Playgroud)\n
主要问题是 Numba 假设 是original一维数组,但事实并非如此。纯 Python 代码之所以有效,是因为解释器从不执行循环体for raw in original,但 Numba 需要在执行之前编译所有代码。您可以使用以下函数原型来解决此问题:
def add(new,original=np.array([[]])): # Note the `[[]]` instead of `[]`
Run Code Online (Sandbox Code Playgroud)
这样,Numba 就可以正确推断出该original数组是一个 2D 数组。
请注意,指定 Numpy 数组和输入的维度和类型是避免此类错误和偷偷摸摸的错误(例如由于整数/浮点截断)的好方法。