Проблема в том, что np.float
не является действительным типом данных для массива NumPy в numba. Вы должны предоставить явный dtype для numba. Это проблема не только с np.empty
, но и с другими процедурами создания массивов, такими как np.ones
, np.zeros
, ... в 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()
Или стенография np.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 ( source ):
Встроенные типы Python
Несколько типов Python эквивалентны скаляру соответствующего массива при использовании для создания объекта dtype:
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 напрямую *1038*:
Типы массивов и преобразования между типами
NumPy поддерживает гораздо большее разнообразие числовых типов, чем Python. В этом разделе показано, какие из них доступны и как изменить тип данных массива.
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!