Передача структурированного массива numpy со строками в функцию Cython

Я пытаюсь создать функцию в Cython, которая принимает простой структурный массив или массив записей путем определения типа структуры Cython. Предположим, у меня есть данные:

a = np.recarray(3, dtype=[('a', np.float32),  ('b', np.int32), ('c', '|S5'), ('d', '|S3')])
a[0] = (1.1, 1, 'this\0', 'to\0')
a[1] = (2.1, 2, 'that\0', 'ta\0')
a[2] = (3.1, 3, 'dogs\0', 'ot\0')

(Примечание: описанная ниже проблема возникает с нулевым терминатором или без него)

Затем у меня есть код Cython:

import numpy as np
cimport numpy as np

cdef packed struct tstruct:
    np.float32_t a
    np.int32_t b
    char[5] c
    char[3] d

def test_struct(tstruct[:] x):
    cdef:
        int k
        tstruct y

    for k in xrange(3):
        y = x[k]
        print y.a, y.b, y.c, y.d

Когда я пытаюсь бежать test_struct(a)Я получаю ошибку:

ValueError: Expected a dimension of size 5, got 8

Если в массиве и соответствующей структуре переупорядочены так, что поля, содержащие строки, не являются смежными друг с другом, то функция работает как ожидалось. Похоже, что функция Cython не обнаруживает границу между c а также d поля правильно и думает, как будто вы передаете в массив символов суммы длин.

Если не считать перестановки данных (что возможно, но не идеально), есть ли другой способ передать массив данных с фиксированной длиной строки в Cython?

Обновление: это, кажется, потенциальная ошибка Cython. См. Следующее обсуждение в группе Google Cython, которое подсказывает, где возникает проблема:

https://groups.google.com/forum/

Обновление 2: эта ошибка была исправлена ​​в основной ветке Cython на Github по состоянию на 23 февраля 2014 г., и патч планируется включить в v0.20.2: https://github.com/cython/cython/commit/58d9361e0a6d4cb3d4e87775f78e0550c2fea836

1 ответ

Решение

Эта ошибка была исправлена ​​в основной ветке Cython на Github по состоянию на 22 февраля 2014 года, и патч планируется включить в v0.20.2: https://github.com/cython/cython/commit/58d9361e0a6d4cb3d4e87775f78e0550c2fea836

Другие вопросы по тегам