Question Comment passer un tableau numpy de types de chaînes à une fonction en Cython


Passer un tableau numpy de type dt np.float64_t fonctionne bien (ci-dessous), mais je ne peux pas passer les tableaux de chaînes.

C'est ce qui fonctionne: 

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

Mais je ne peux pas faire ce travail: Je ne trouve pas les identificateurs de type correspondants pour les types de chaînes numériques.

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

L'erreur de compilation est la suivante: 

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

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

METTRE À JOUR

Par regarder à travers numpy.pxd, Je vois ce qui suit ctypedef déclarations. Peut-être que cela suffit à dire que je peux utiliser uint8_t et prétendre que tout est normal, du moment que je peux faire du casting?

ctypedef unsigned char      npy_uint8
ctypedef npy_uint8      uint8_t

Il suffit de voir combien ce casting sera coûteux.


15
2018-06-12 18:59


origine


Réponses:


On dirait que tu n'as pas de chance.

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

Certains types de données ne sont pas encore pris en charge, comme les tableaux booléens et les tableaux de chaînes.


Cette réponse n'est plus valable, comme le montre la réponse de Saullo Castro, mais je vais la laisser à des fins historiques.


7
2018-06-12 20:43



Avec Cython 0.20.1, il fonctionne avec cdef np.ndarray, sans spécifier le type de données et le nombre de dimensions:

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)

6
2018-06-04 20:11