如何在 numba 编译函数中使用 np.empty;错误消息 "All templates rejected"
How to use np.empty inside numba compiled function; Error message "All templates rejected"
我 运行 尝试在用 numba 编译的函数定义中使用 np.empty
并打开 nopython=True
以确保优化类型生效时出现这个奇怪的错误。
这很奇怪,因为 numba 声称支持 np.empty
前两个参数,而我只使用前两个参数(我认为正确吗?),所以我不知道为什么它输入不正确.
@jit(nopython=True)
def empty():
return np.empty(5, np.float)
在 ipython notebook 中定义上述函数后,
empty()
给出以下错误信息:
---------------------------------------------------------------------------
TypingError Traceback (most recent call last)
<ipython-input-88-927345c8757f> in <module>()
----> 1 empty()
~/.../lib/python3.5/site-packages/numba/dispatcher.py in _compile_for_args(self, *args, **kws)
342 raise e
343 else:
--> 344 reraise(type(e), e, None)
345 except errors.UnsupportedError as e:
346 # Something unsupported is present in the user code, add help info
~/.../lib/python3.5/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 at nopython (nopython frontend)
Invalid usage of Function(<built-in function empty>) with parameters (int64, Function(<class 'float'>))
* parameterized
In definition 0:
All templates rejected
[1] During: resolving callee type: Function(<built-in function empty>)
[2] During: typing of call at <ipython-input-87-8c7e8fa4c6eb> (3)
File "<ipython-input-87-8c7e8fa4c6eb>", line 3:
def empty():
return np.empty(5, np.float)
^
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
问题是 np.float
不是 numba 中 NumPy 数组的 有效 数据类型。您必须向 numba 提供显式数据类型。这不仅是 np.empty
的问题,也是其他数组创建例程的问题,例如 np.ones
、np.zeros
、... in numba.
要使您的示例正常工作,只需稍作改动:
from numba import jit
import numpy as np
@jit(nopython=True)
def empty():
return np.empty(5, np.float64) # np.float64 instead of np.float
empty()
或shorthandnp.float_
。或者,如果您想要 32 位浮点数,请改用 np.float32
。
请注意 np.float
只是普通 Python float
的别名,因此不是 real NumPy dtype:
>>> np.float is float
True
>>> issubclass(np.float, np.generic)
False
>>> issubclass(np.float64, np.generic)
True
同样,还有一些其他别名只是被解释为 NumPy dtypes (source):
Built-in Python types
Several python types are equivalent to a corresponding array scalar when used to generate a dtype object:
int int_
bool bool_
float float_
complex cfloat
bytes bytes_
str bytes_ (Python2) or unicode_ (Python3)
unicode unicode_
buffer void
(all others) object_
然而 numba 不知道这些别名,即使不处理 numba 你可能最好使用 real dtypes directly:
Array types and conversions between types
NumPy supports a much greater variety of numerical types than Python does. This section shows which are available, and how to modify an array’s data-type.
Data type Description
bool_ Boolean (True or False) stored as a byte
int_ Default integer type (same as C long; normally either int64 or int32)
intc Identical to C int (normally int32 or int64)
intp Integer used for indexing (same as C ssize_t; normally either int32 or int64)
int8 Byte (-128 to 127)
int16 Integer (-32768 to 32767)
int32 Integer (-2147483648 to 2147483647)
int64 Integer (-9223372036854775808 to 9223372036854775807)
uint8 Unsigned integer (0 to 255)
uint16 Unsigned integer (0 to 65535)
uint32 Unsigned integer (0 to 4294967295)
uint64 Unsigned integer (0 to 18446744073709551615)
float_ Shorthand for float64.
float16 Half precision float: sign bit, 5 bits exponent, 10 bits mantissa
float32 Single precision float: sign bit, 8 bits exponent, 23 bits mantissa
float64 Double precision float: sign bit, 11 bits exponent, 52 bits mantissa
complex_ Shorthand for complex128.
complex64 Complex number, represented by two 32-bit floats (real and imaginary components)
complex128 Complex number, represented by two 64-bit floats (real and imaginary components)
请注意,numba 不支持其中一些!
我 运行 尝试在用 numba 编译的函数定义中使用 np.empty
并打开 nopython=True
以确保优化类型生效时出现这个奇怪的错误。
这很奇怪,因为 numba 声称支持 np.empty
前两个参数,而我只使用前两个参数(我认为正确吗?),所以我不知道为什么它输入不正确.
@jit(nopython=True)
def empty():
return np.empty(5, np.float)
在 ipython notebook 中定义上述函数后,
empty()
给出以下错误信息:
---------------------------------------------------------------------------
TypingError Traceback (most recent call last)
<ipython-input-88-927345c8757f> in <module>()
----> 1 empty()
~/.../lib/python3.5/site-packages/numba/dispatcher.py in _compile_for_args(self, *args, **kws)
342 raise e
343 else:
--> 344 reraise(type(e), e, None)
345 except errors.UnsupportedError as e:
346 # Something unsupported is present in the user code, add help info
~/.../lib/python3.5/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 at nopython (nopython frontend)
Invalid usage of Function(<built-in function empty>) with parameters (int64, Function(<class 'float'>))
* parameterized
In definition 0:
All templates rejected
[1] During: resolving callee type: Function(<built-in function empty>)
[2] During: typing of call at <ipython-input-87-8c7e8fa4c6eb> (3)
File "<ipython-input-87-8c7e8fa4c6eb>", line 3:
def empty():
return np.empty(5, np.float)
^
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
问题是 np.float
不是 numba 中 NumPy 数组的 有效 数据类型。您必须向 numba 提供显式数据类型。这不仅是 np.empty
的问题,也是其他数组创建例程的问题,例如 np.ones
、np.zeros
、... in numba.
要使您的示例正常工作,只需稍作改动:
from numba import jit
import numpy as np
@jit(nopython=True)
def empty():
return np.empty(5, np.float64) # np.float64 instead of np.float
empty()
或shorthandnp.float_
。或者,如果您想要 32 位浮点数,请改用 np.float32
。
请注意 np.float
只是普通 Python float
的别名,因此不是 real NumPy dtype:
>>> np.float is float
True
>>> issubclass(np.float, np.generic)
False
>>> issubclass(np.float64, np.generic)
True
同样,还有一些其他别名只是被解释为 NumPy dtypes (source):
Built-in Python types
Several python types are equivalent to a corresponding array scalar when used to generate a dtype object:
int int_ bool bool_ float float_ complex cfloat bytes bytes_ str bytes_ (Python2) or unicode_ (Python3) unicode unicode_ buffer void (all others) object_
然而 numba 不知道这些别名,即使不处理 numba 你可能最好使用 real dtypes directly:
Array types and conversions between types
NumPy supports a much greater variety of numerical types than Python does. This section shows which are available, and how to modify an array’s data-type.
Data type Description bool_ Boolean (True or False) stored as a byte int_ Default integer type (same as C long; normally either int64 or int32) intc Identical to C int (normally int32 or int64) intp Integer used for indexing (same as C ssize_t; normally either int32 or int64) int8 Byte (-128 to 127) int16 Integer (-32768 to 32767) int32 Integer (-2147483648 to 2147483647) int64 Integer (-9223372036854775808 to 9223372036854775807) uint8 Unsigned integer (0 to 255) uint16 Unsigned integer (0 to 65535) uint32 Unsigned integer (0 to 4294967295) uint64 Unsigned integer (0 to 18446744073709551615) float_ Shorthand for float64. float16 Half precision float: sign bit, 5 bits exponent, 10 bits mantissa float32 Single precision float: sign bit, 8 bits exponent, 23 bits mantissa float64 Double precision float: sign bit, 11 bits exponent, 52 bits mantissa complex_ Shorthand for complex128. complex64 Complex number, represented by two 32-bit floats (real and imaginary components) complex128 Complex number, represented by two 64-bit floats (real and imaginary components)
请注意,numba 不支持其中一些!