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

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

This is what works :

# 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)

But I can't make this work: Я не могу найти подходящие идентификаторы типов. для NumPy строки типа.

# 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)

The compilation error is :

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

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

Ответы на вопрос(2)

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)
 14 февр. 2018 г., 09:24
@TedPetrou Я пытаюсь построить пример, гдеdtype=object ускорится, чтобы обновить ответ, но до сих пор я нашел, что это эквивалентно не указавdtype, Как вы измерили 100-кратную скорость?
 14 февр. 2018 г., 16:42
Похоже, я сильно ошибся в своем предыдущем комментарии. Похоже, я получаю 5-кратное улучшение, переходя на объект. Используйте этот массив.a = np.array(['some', 'strings', 'in', 'an', 'array'] * 10 ** 5)

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

Some data types are not yet supported, like boolean arrays and string arrays.

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

 HeyWatchThis12 июн. 2012 г., 23:00
Благодарю. Я проголосовал за ваш ответ. Хотя я надеюсь, что есть обходной путь с использованием возможно структурированного массива Numpy [docs.scipy.org/doc/numpy/user/…, Но я все еще ищу, как пройти один из них тоже.
 24 февр. 2017 г., 13:32
Содержание этой ссылки было изменено. Цитата не существует.
 13 июн. 2012 г., 15:10
Быть способным использовать их медленно - все же лучше, чем вообще не использовать их, правда?
 HeyWatchThis13 июн. 2012 г., 00:47
По крайней мере, для моих целей, используя cProfile, похоже, что вы все еще можете передавать массивы Numpy без ввода в Cython. Но вы не получите оптимизацию Cython, описанную в вашей ссылке на readthedocs.org.

Ваш ответ на вопрос