Передача структурированного массива 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