【问题标题】:Does Numba support in-built python function e.g. `setitem`Numba 是否支持内置的 python 函数,例如`setitem`
【发布时间】:2021-04-19 10:32:01
【问题描述】:
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
No implementation of function Function(<built-in function setitem>) found for signature:

当尝试使用以下命令SG_Z[SG_Z &lt; Threshold] = 0 将矩阵SG_Z 中小于给定阈值的所有元素设置为零时遇到此错误

此命令正在使用 Numba @jit 并行化的函数中使用。由于这条线的存在,函数没有运行。

【问题讨论】:

    标签: numpy numba numpy-ufunc numba-pro


    【解决方案1】:

    你对SG_Z 说得不多,但我怀疑它是 2d(或更高)。 numba 的多维索引能力有限(与 numpy 相比)

    In [133]: arr = np.random.rand(3,4)
    In [134]: arr
    Out[134]: 
    array([[0.8466427 , 0.37340328, 0.07712635, 0.34466743],
           [0.86591184, 0.32048868, 0.1260246 , 0.9811717 ],
           [0.28948191, 0.32099879, 0.54819722, 0.78863841]])
    In [135]: arr<.5
    Out[135]: 
    array([[False,  True,  True,  True],
           [False,  True,  True, False],
           [ True,  True, False, False]])
    In [136]: arr[arr<.5]
    Out[136]: 
    array([0.37340328, 0.07712635, 0.34466743, 0.32048868, 0.1260246 ,
           0.28948191, 0.32099879])
    

    numba

    In [137]: import numba
    In [138]: @numba.njit
         ...: def foo(arr, thresh):
         ...:     arr[arr<.5]=0
         ...:     return arr
         ...: 
    In [139]: foo(arr,.5)
    Traceback (most recent call last):
      File "<ipython-input-139-33ea2fda1ea2>", line 1, in <module>
        foo(arr,.5)
      File "/usr/local/lib/python3.8/dist-packages/numba/core/dispatcher.py", line 420, in _compile_for_args
        error_rewrite(e, 'typing')
      File "/usr/local/lib/python3.8/dist-packages/numba/core/dispatcher.py", line 361, in error_rewrite
        raise e.with_traceback(None)
    TypingError: No implementation of function Function(<built-in function setitem>) found for signature:
     
     >>> setitem(array(float64, 2d, C), array(bool, 2d, C), Literal[int](0))
     
    There are 16 candidate implementations:
      - Of which 14 did not match due to:
      Overload of function 'setitem': File: <numerous>: Line N/A.
        With argument(s): '(array(float64, 2d, C), array(bool, 2d, C), int64)':
       No match.
      - Of which 2 did not match due to:
      Overload in function 'SetItemBuffer.generic': File: numba/core/typing/arraydecl.py: Line 171.
        With argument(s): '(array(float64, 2d, C), array(bool, 2d, C), int64)':
       Rejected as the implementation raised a specific error:
         TypeError: unsupported array index type array(bool, 2d, C) in [array(bool, 2d, C)]
      raised from /usr/local/lib/python3.8/dist-packages/numba/core/typing/arraydecl.py:68
    
    During: typing of setitem at <ipython-input-138-6861f217f595> (3)
    

    一般不是setitem 丢失; numba 一直这样做。 setitem 表示这种特殊的参数组合。

    如果我先解开数组,它确实有效。

    In [140]: foo(arr.ravel(),.5)
    Out[140]: 
    array([0.8466427 , 0.        , 0.        , 0.        , 0.86591184,
           0.        , 0.        , 0.9811717 , 0.        , 0.        ,
           0.54819722, 0.78863841])
    

    但在numba 中,我们不必害怕迭代,因此对于二维输入,我们可以对行进行迭代:

    In [148]: @numba.njit
         ...: def foo(arr, thresh):
         ...:     for i in arr:
         ...:         i[i<thresh] = 0
         ...:     return arr
         ...: 
    In [149]: foo(arr,.5)
    Out[149]: 
    array([[0.8466427 , 0.        , 0.        , 0.        ],
           [0.86591184, 0.        , 0.        , 0.9811717 ],
           [0.        , 0.        , 0.54819722, 0.78863841]])
    

    可能有更通用的方法来编写它并提供签名,但这应该会提供一些关于如何解决这个问题的想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      相关资源
      最近更新 更多