在用`numba`的`@jit(nopython = True)`装饰的函数内创建`NumPy`数组?

时间:2015-05-24 18:47:46

标签: python arrays numpy numba

我想在用numba的{​​{1}}装饰的函数内创建一个numpy数组。例如:

@jit(nopython=True)

编译此脚本会产生以下错误:

import numpy as np
import numba

@numba.jit(nopython=True)
def funny_func():
    zero_array = np.zeros(10)

    sum_result = 0

    for elem in zero_array:
        sum_result += elem

    return sum_result

print funny_func()

因此,UntypedAttributeError: Unknown attribute "zeros" of type Module(<module 'numpy' from 'A:\Anaconda\lib\site-packages\numpy\__init__.pyc'>) 不支持numba数组创建函数。那么如何在这样一个装饰好的“NumPy函数”中创建NumPy数组?

2 个答案:

答案 0 :(得分:2)

正如the docs明确说:

  

nopython模式不支持NumPy数组创建。 Numba通过在nopython模式下自动尝试jit循环来缓解这个问题。这允许在函数顶部创建数组,同时仍然获得几乎所有nopython模式的性能。

(我链接到旧版本,因为我认为此限制在0.18中不存在,这意味着您使用的是旧版本。即使是旧版本,我认为在0.12左右之前,不要#39; t有这个文档,因为自动提升还没有存在,你必须手动完成,但下面的方法也一样。)

如果您使用太旧的Numba版本来拥有该功能,或者您已经做了一些复杂的事情来混淆该功能并使其无效,那么您必须这样做同样的事情手动。例如:

@numba.jit(nopython=True)
def _funny_func(zero_array):    
    sum_result = 0

    for elem in zero_array:
        sum_result += elem

    return sum_result

@numba.jit(nopython=False)
def funny_func():
    zero_array = np.zeros(10)
    return _funny_func(zero_array)

答案 1 :(得分:1)

这不再是新版numba中的一个问题。例如,在版本0.33上,您发布的代码没有问题。

两年前(corresponding pull request on github)他们增加了支持:

  • np.zeros
  • np.zeros_like
  • np.ones
  • np.ones_like
  • np.empty
  • np.empty_like
  • np.full
  • np.full_like
  • np.arange
  • np.linspace(只有三个参数形式)
  • np.eye
  • np.identity

现在列为"Supported NumPy features" - 'Other functions'