David Cournapeau wrote:
>
> float *dest;
> for i in range(nrows):
> mempcy(dest + i * ncols, a[i], number of bytes in a[i])
>
> and then use dest to create a numpy array.
Thanks guys for all your help! I've managed to get it working. I now use
the following functions to convert from float ** to 2D numpy and vice-versa:
cdef inline float **npy2c_float(np.ndarray a):
cdef int m = a.shape[0]
cdef int n = a.shape[1]
cdef int i
cdef float **data
data = <float **> malloc(m*sizeof(float*))
for i in range(m):
data[i] = &(<float *>a.data)[i*n]
return data
cdef inline np.ndarray c2npy_float(float **a, int n, int m):
cdef np.ndarray[DTYPE_t,ndim=2]result = np.zeros((m,n),dtype=DTYPE)
cdef float *dest
cdef int i
dest = <float *> malloc(m*n*sizeof(float*))
for i in range(m):
memcpy(dest + i*n,a[i],m*sizeof(float*))
free(a[i])
memcpy(result.data,dest,m*n*sizeof(float*))
free(dest)
free(a)
return result
This of course assumes a is contiguous.
> In C, using ragged arrays is generally not a good idea - of course, if
> your externaly library uses it, you have no choice, but for your own
> code, you are often better using plain float*.
I see. And it seems that float* is also more flexible for n-d arrays.
But, another dumb C question, if you have an array as float*, can you
use it (in C) as array[i][j] or you need to refer to it as array[i+ncols*j]?
Thanks again for all the help and for making the great piece of software
that Cython is!
Cheers,
Tiago
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev