Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 438
HeyWatchThis Avatar asked Jun 12 '12 18:06

HeyWatchThis


People also ask

Does NumPy work with Cython?

You can use NumPy from Cython exactly the same as in regular Python, but by doing so you are losing potentially high speedups because Cython has support for fast access to NumPy arrays.

Can NumPy array take strings?

The elements of a NumPy array, or simply an array, are usually numbers, but can also be boolians, strings, or other objects.

What is Astype NumPy?

To modify the data type of a NumPy array, use the astype(data type) method. It is a popular function in Python used to modify the dtype of the NumPy array we've been provided with. We'll use the numpy. astype() function to modify the dtype of the specified array object.


2 Answers

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)
like image 198
Saullo G. P. Castro Avatar answered Oct 01 '22 21:10

Saullo G. P. Castro


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.

like image 29
JAB Avatar answered Oct 01 '22 23:10

JAB