numba:找不到签名的函数 Function(<built-in function getitem>) 的实现:

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\n
Run Code Online (Sandbox Code Playgroud)\n

另外,如果我删除代码的最后一部分:

\n
  else:\n    res=np.zeros((1,22))\n    res[0]=new\n    return res\n
Run 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        ^\n
Run Code Online (Sandbox Code Playgroud)\n

更新:\n这是它应该如何工作的。该功能应涵盖三种主要情况

\n

新数据的示例输入(一维数组):

\n
array([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])\n
Run Code Online (Sandbox Code Playgroud)\n

原始数据的示例输入(二维数组):

\n
array([[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
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 将添加新数据且没有原始数据
  2. \n
\n
add(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]])\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 将添加新数据,之前已经添加过\xc2\xb4t并且有原始数据
  2. \n
\n
add(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\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 将添加之前已添加的新数据
  2. \n
\n
add(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]])\n
Run Code Online (Sandbox Code Playgroud)\n

Jér*_*ard 8

主要问题是 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 数组和输入的维度和类型是避免此类错误和偷偷摸摸的错误(例如由于整数/浮点截断)的好方法。