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.
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.
The elements of a NumPy array, or simply an array, are usually numbers, but can also be boolians, strings, or other objects.
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.
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)
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With