Cython Memoryviews из массива структур?

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

Если моя структура представляет собой только первичные типы данных, например следующее:

cdef packed struct oh_hi:
    int lucky
    char unlucky

Тогда следующее работает нормально:

  DEF MAXPOWER = 1000000
  cdef oh_hi * hi2u = <oh_hi *>malloc(sizeof(oh_hi)*MAXPOWER)
  cdef oh_hi [:] hi2me = <oh_hi[:MAXPOWER]> hi2u

Но как только я изменю свою структуру, чтобы она содержала массив символов:

cdef packed struct oh_hi:
    int lucky
    char unlucky[10]

Предыдущее приведение memoryview компилируется, но при запуске выдает:

  ValueError: Expected 1 dimension(s), got 1

Есть ли простой способ сделать это в Cython? Я знаю, что я мог бы создать структурированный массив, но, на самом деле, это не позволило бы мне назначать структуры C прямо в него.


person radikalus    schedule 21.06.2013    source источник
comment
Это похоже на эту проблему со структурированными массивами numpy. Проблема в том, что cython, похоже, не любит смешивать массивы со скалярными значениями, если первый элемент в структуре является скаляром. Обходной путь состоит в том, чтобы просто переставить элементы в структуре таким образом, чтобы всегда был член/элемент массива первым.   -  person CodeSurgeon    schedule 29.01.2018


Ответы (1)


На самом деле, просто создание структурированного массива numpy, а затем представление памяти работает отлично.

cdef np.ndarray hi2u = np.ndarray((MAXPOWER,),dtype=[('lucky','i4'),('unlucky','a10')])
cdef oh_hi [:] hi2me = hi2u

Производительность этого кажется довольно хорошей, и это сохраняет более позднюю копию, если вам нужны данные обратно в python. Как обычно, версия numpy довольно хороша. =р

person radikalus    schedule 21.06.2013
comment
Это не сработало для меня. Может быть, потому что я использовал фиксированный массив int32, а не строку «a10». В итоге я сгладил конструкции. - person dashesy; 09.01.2014
comment
Я посмотрю на это, но как вы надеялись, что они будут храниться в структуре numpy? - person radikalus; 02.02.2014
comment
для 10 целых чисел, какая-то строка («счастливая», (np.int32,10)) - person dashesy; 03.02.2014