Доступ к структурированным типам данных в numba против numpy - PullRequest
1 голос
/ 07 февраля 2020

Я заметил несоответствие между тем, как 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.

...