SWIG, C ++, Python и NumPY: преобразование вектора std с настраиваемой структурой в массив NumPY с этой структурой - PullRequest
0 голосов
/ 18 июня 2020

Прошу прощения, если об этом спрашивали раньше, но я не смог найти никакого решения этой конкретной проблемы.

Проблема в том, что у меня есть 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 ++. Я просмотрел ссылки на эти два объекта, но они очень загадочны.

Я был бы очень благодарен, если бы кто-нибудь мог просветить меня и направить меня в правильном направлении. К сожалению, я не могу сохранить исходное решение, так как многие другие части кода требуют этого интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...