我想在用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
数组?
答案 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