Как передать массив numpy типов строк в функцию в Cython

Передача массива numpy dtype np.float64_t работает отлично (ниже), но я не могу передать строковые массивы.

Это то, что работает:

# cython_testing.pyx
import numpy as np
cimport numpy as np

ctypedef np.float64_t dtype_t 

cdef func1 (np.ndarray[dtype_t, ndim=2] A):
    print A 

def testing():
    chunk = np.array ( [[94.,3.],[44.,4.]], dtype=np.float64)

    func1 (chunk)

Но я не могу выполнить эту работу: Я не могу найти подходящие идентификаторы типов для numty string dtypes.

# cython_testing.pyx
import numpy as np
cimport numpy as np

ctypedef np.string_t dtype_str_t 

cdef func1 (np.ndarray[dtype_str_t, ndim=2] A):
    print A 

def testing():
    chunk = np.array ( [['huh','yea'],['swell','ray']], dtype=np.string_)

    func1 (chunk)

Ошибка компиляции:

Error compiling Cython file:
------------------------------------------------------------
ctypedef np.string_t dtype_str_t 
    ^
------------------------------------------------------------

cython_testing.pyx:9:9: 'string_t' is not a type identifier

UPDATE

При просмотре numpy.pxd я вижу следующие инструкции ctypedef. Может быть, этого достаточно, чтобы сказать, что я могу использовать uint8_t и притворяться, что все нормально, до тех пор, пока я могу сделать кастинг?

ctypedef unsigned char      npy_uint8
ctypedef npy_uint8      uint8_t

Просто посмотрите, насколько дорого будет кастинг.

Ответы

Ответ 1

Похоже, вам не повезло.

http://cython.readthedocs.org/en/latest/src/tutorial/numpy.html

Некоторые типы данных еще не поддерживаются, например, булевые массивы и массивы строк.


Этот ответ больше не действителен, как показано ответом Сауло Кастро, но я оставлю его в исторических целях.

Ответ 2

С Cython 0.20.1 он работает с использованием cdef np.ndarray без указания типа данных и количества измерений:

import numpy as np
cimport numpy as np

cdef func1(np.ndarray A):
    print A

def testing():
    chunk = np.array([['huh','yea'], ['swell','ray']])
    func1(chunk)