Прошу прощения, если об этом спрашивали раньше, но я не смог найти никакого решения этой конкретной проблемы.
Проблема в том, что у меня есть std :: vector структуры, подобной этой :
struct Tag {
uint8_t type;
uint8_t reserved;
uint16_t missed_events;
uint32_t channel;
uint64_t timestamp;
};
Я хочу преобразовать его в NumPy массив структур при вызове метода директора в SWIG. В настоящее время я могу преобразовать его в массив int NumPy следующим образом:
%typemap(directorin,numinputs=1) (std::vector<Tag> & incoming_tags)
{
npy_intp dim = (npy_intp)($1.size() * sizeof(Tag) / sizeof(int));
$input = PyArray_SimpleNewFromData(1, &dim, NPY_INT, (void *)$1.data());
}
Затем в python я делаю что-то вроде этого:
class CustomMeasurement(CustomMeasurementBase):
def __init__(self, time_tagger):
CustomMeasurementBase.__init__(self, time_tagger)
self.dtype = numpy.dtype({'names':['type','missed_events','channel','time'], 'formats':['u1','<u2','<i4','<i8'], 'offsets':[0,2,4,8], 'itemsize':16}, align=True)
def impl(self, incoming_tags, begin_time, end_time):
tags = incoming_tags.view(self.dtype)
Проблема с это то, что я полагаюсь на оболочку Python для преобразования типа int в тег. Я хочу удалить приведение и использовать определение структуры непосредственно на карте типов. Насколько мне известно, NumPY позволяет это через PyArray_NewFromDescr Справочник по API . Проблема, с которой я столкнулся , заключается в том, что для функции требуется PyTypeObject для подтипа и PyArray_Descr для моего типа структуры. Дело в том, что я понятия не имею, как зарегистрировать и построить свой структурный тип в API Python из C ++. Я просмотрел ссылки на эти два объекта, но они очень загадочны.
Я был бы очень благодарен, если бы кто-нибудь мог просветить меня и направить меня в правильном направлении. К сожалению, я не могу сохранить исходное решение, так как многие другие части кода требуют этого интерфейса.