HeyWatchThis
HeyWatchThis

Reputation: 23433

How to pass a numpy array of string types to a function in Cython

Passing a numpy array of dtype np.float64_t works fine ( below), but I can't pass string arrays.

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: I can't find the matching 'type identifiers' for numpy 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)

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

Per looking through numpy.pxd, I see the following ctypedef statements. Maybe that's enough to say I can use uint8_t and pretend everything is normal, as long as I can do some casting?

ctypedef unsigned char      npy_uint8
ctypedef npy_uint8      uint8_t

Just have to see how expensive that casting will be.

Upvotes: 20

Views: 5460

Answers (2)

JAB
JAB

Reputation: 21079

Looks like you're out of luck.

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

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


This answer is no longer valid as shown by Saullo Castro's answer, but I'll leave it for historical purposes.

Upvotes: 7

Saullo G. P. Castro
Saullo G. P. Castro

Reputation: 58885

With Cython 0.20.1 it works using cdef np.ndarray, without specifying the data type and the number of 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)

Upvotes: 9

Related Questions