Python / Numba:scipy.special.gammainc()出现未知属性错误

发布于 2021-01-29 14:10:19

使用@jit装饰器运行代码时出现错误。似乎无法找到函数scipy.special.gammainc()的某些信息:

Failed at nopython (nopython frontend)
Unknown attribute 'gammainc' for Module(<module 'scipy.special' from 'C:\home\Miniconda\lib\site-packages\scipy\special\__init__.pyc'>) $164.2 $164.3 = getattr(attr=gammainc, value=$164.2)

没有@jit装饰器,代码将正常运行。也许需要一些使scipy.special模块的属性对Numba可见的东西?

在此先感谢您的任何建议,评论等。

关注者
0
被浏览
163
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    问题在于这gammainc不是Numba固有的一小部分函数(请参阅http://numba.pydata.org/numba-
    doc/dev/reference/numpysupported.html)-
    实际上没有的功能。不幸的是,这意味着您不能在“ nopython”模式下使用它-
    它只需要将其视为普通的python函数调用即可。

    如果删除nopython=True,它应该可以工作。但是,这并不十分令人满意,因为它可能会更慢。没有看到您的代码,很难知道确切的建议。但是,通常:

    • gammainc即使没有nopython,循环(不包含)的速度也会加快。

    • gammainc 是一个“ ufunc”,这意味着它可以一次轻松地应用于整个阵列,并且无论如何应该快速运行。

    • 您可以致电func.inspect_types()查看它是否可以编译。

    作为一个简单的例子:

    from scipy.special import gammainc
    import numba as nb
    import numpy as np
    
    @nb.jit # note - no "nopython"
    def f(x):
      for n in range(x.shape[0]):
        x[n] += 1
      y = gammainc(x,2.5)
      for n in range(y.shape[0]):
        y[n] -= 1
      return y
    
    f(np.linspace(0,20)) # forces it to be JIT'd and outputs an array
    

    然后f.inspect_types()将这两个循环标识为“提升循环”,这意味着它们将被准时化并快速运行。与的位gammainc不是JIT’d,而是立即应用于整个数组,因此也应该很快。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看