python - 打字错误 : Failed in nopython mode pipeline (step: nopython frontend)

标签 python pandas jit numba

我正在尝试使用 numba jit 编写我的第一个函数,我有一个 Pandas 数据框,我需要遍历它并找到每 350 个点的均方根,因为 python 的 for 循环非常慢,我决定尝试使用 numba jit,代码是:

@jit(nopython=True)
def find_rms(data, length):
    res = []
    for i in range(length, len(data)):
        interval = np.array(data[i-length:i])
        interval =np.power(interval, 2)
        sum = interval.sum()
        resI = sum/length
        resI = np.sqrt(res)
        res.appennd(resI)
    return res

mydf = np.array(df.iloc[:]['c0'], dtype=np.float64)
df.iloc[350:]['rms'] = find_rms(mydf, 350)

我在某处读到我需要指定数据类型,因此我写了“dtype = np.float64”,但我仍然收到错误消息:
---------------------------------------------------------------------------
TypingError                               Traceback (most recent call last)
<ipython-input-39-4d388f72efdc> in <module>
----> 1 df.iloc[350:]['rms'] = find_rms(mydf, 350.0)

c:\users\1\appdata\local\programs\python\python35\lib\site-packages\numba\dispatcher.py in _compile_for_args(self, *args, **kws)
    346                 e.patch_message(msg)
    347 
--> 348             error_rewrite(e, 'typing')
    349         except errors.UnsupportedError as e:
    350             # Something unsupported is present in the user code, add help info

c:\users\1\appdata\local\programs\python\python35\lib\site-packages\numba\dispatcher.py in error_rewrite(e, issue_type)
    313                 raise e
    314             else:
--> 315                 reraise(type(e), e, None)
    316 
    317         argtypes = []

c:\users\1\appdata\local\programs\python\python35\lib\site-packages\numba\six.py in reraise(tp, value, tb)
    656             value = tp()
    657         if value.__traceback__ is not tb:
--> 658             raise value.with_traceback(tb)
    659         raise value
    660 

TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Invalid use of Function(<built-in function array>) with argument(s) of type(s): (array(float64, 1d, C))
 * parameterized
In definition 0:
    TypingError: array(float64, 1d, C) not allowed in a homogeneous sequence
    raised from c:\users\1\appdata\local\programs\python\python35\lib\site-packages\numba\typing\npydecl.py:463
In definition 1:
    TypingError: array(float64, 1d, C) not allowed in a homogeneous sequence
    raised from c:\users\1\appdata\local\programs\python\python35\lib\site-packages\numba\typing\npydecl.py:463
This error is usually caused by passing an argument of a type that is unsupported by the named function.
[1] During: resolving callee type: Function(<built-in function array>)
[2] During: typing of call at <ipython-input-34-edd252715b2d> (5)


File "<ipython-input-34-edd252715b2d>", line 5:
def find_rms(data, length):
    <source elided>
    for i in range(length, len(data)):
        interval = np.array(data[i-length:i])
        ^

This is not usually a problem with Numba itself but instead often caused by
the use of unsupported features or an issue in resolving types.

To see Python/NumPy features supported by the latest release of Numba visit:
http://numba.pydata.org/numba-doc/dev/reference/pysupported.html
and
http://numba.pydata.org/numba-doc/dev/reference/numpysupported.html

For more information about typing errors and how to debug them visit:
http://numba.pydata.org/numba-doc/latest/user/troubleshoot.html#my-code-doesn-t-compile

If you think your code should work with Numba, please report the error message
and traceback, along with a minimal reproducer at:
https://github.com/numba/numba/issues/new

有谁知道问题是什么?

最佳答案

您在 append 中输入错误而且我认为您在取平方根方面也犯了一个错误(我相信 resI 而不是 res )。
除此之外,唯一的问题是 interval 的初始化问题。 . Numba不希望您将 numpy 数组传递给 numpy 数组。包装 np.array 没有任何帮助在数组的切片周围,python 根本不在乎你是否这样做,而是像对待你一样对待代码 Numba在 nopython 模式下确实关心并抛出错误。留下那部分解决了问题。

@jit(nopython=True)
def find_rms(data, length):
    res = []
    for i in range(length, len(data)):
        interval = data[i-length:i]
        interval = np.power(interval, 2)
        sum = interval.sum()
        resI = sum/length
        resI = np.sqrt(resI)
        res.append(resI)
    return res

mydf = np.array(df.iloc[:]['c0'], dtype=np.float64)
target = find_rms(mydf, 350)

关于python - 打字错误 : Failed in nopython mode pipeline (step: nopython frontend),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55065419/

相关文章:

python - Sphinx 自动摘要为每个类生成两个摘要

python - 在数据框中创建最大/最小列时选择列的问题

python - 为什么 Pandas 停止解析 mm/dd/yyyy 日期格式?

PYTHON Pandas - 根据其他数据框中的值对数据框使用 Pandas 样式

interpreter - llvm/工具 : lli REPL compared to LuaJIT

Java 循环在一些运行/JIT 故障后变慢?

python - Django/PostgreSQL 与 TextField object_id 字段的通用关系

python - Heroku 上的进程间通信

python - Django/python 测试 django 表单

c# - 在编译 C# 应用程序时设置平台有什么不同吗?