Я заметил несоответствие между тем, как numba
и numpy
разрешают доступ к различным подполям массивов со структурированными типами данных. Я тестирую следующие определения нескольких функций, обращающихся к подполям и массиву a
:
import numba
import numpy
@numba.njit
def func_numba(a):
return a[5].field0
def func_numpy(a):
return a[5].field0
def func_numpy_recarray(a):
return numpy.rec.array(a)[5].field0
a = numpy.zeros(10, dtype=[('field0', 'i4'), ('field1', 'f8')])
a['field0'] = numpy.arange(10)
# array([(0, 0.), (1, 0.), (2, 0.), (3, 0.), (4, 0.), (5, 0.), (6, 0.),
# (7, 0.), (8, 0.), (9, 0.)],
# dtype=[('field0', '<i4'), ('field1', '<f8')])
Вызов различных функций показывает, что версия func_numba
работает, хотя «нормальный» версия той же функции не имеет:
func_numba(a)
# 5
func_numpy(a)
# AttributeError: 'numpy.void' object has no attribute 'field0'
func_numpy_recarray(a)
# 5
Возможность доступа к подполям через атрибуты обычно предоставляется только в numpy
массивах записей, как показано в функции func_numpy_recarray
, поэтому я предполагая, что numba
имеет какое-то отдельное представление массивов numpy
с различными для них определенными операциями. К сожалению, не так просто проверить тип или свойства объекта в numba
JIT-функциях.
Это преднамеренное различие между numba
и обычным numpy
и каков предпочтительный способ доступа к структурированным типам данных в numba
?
Я использую numba
версия 0.48.0.