On Wed, Jul 2, 2014 at 12:15 PM, Mads Ipsen <mads.ip...@gmail.com> wrote:
> Hi,
>
> If you setup an M x N array like this
>
>   a = 1.0*numpy.arange(24).reshape(8,3)
>
> you can access the data from a C function like this
>
> void foo(PyObject * numpy_data)
> {
>     // Get dimension and data pointer
>     int const m = static_cast<int>(PyArray_DIMS(numpy_data)[0]);
>     int const n = static_cast<int>(PyArray_DIMS(numpy_data)[1]);
>     double * const data = (double *) PyArray_DATA(numpy_data);
>
>     // Access data
>     ...
> }
>
> Now, suppose I have an irregular shaped numpy array like this
>
>   a1 = numpy.array([ 1.0, 2.0, 3.0])
>   a2 = numpy.array([-2.0, 4.0])
>   a3 = numpy.array([5.0])
>   b  = numpy.array([a1,a2,a3])
>
> How can open up the doors to the array data of b on the C-side?
>

numpy does not directly support irregular shaped arrays (or ragged arrays).
If you look at the result of your example you will see this:
In [5]: b
Out[5]: array([array([ 1.,  2.,  3.]), array([-2.,  4.]), array([
5.])], dtype=object)

b has datatype object, this means it is a 1d array containing more
array objects. Numpy does not directly know about the shapes or types
the sub arrays. It is not necessarily homogeneous anymore, but
compared to a regular python list you still have elementwise
operations (if the contained python objects support them) and it can
have multiple dimensions.

In C you would access such an array it like this:

PyArrayObject * const data = (PyArrayObject *) PyArray_DATA(numpy_data);
for (i=0; i < PyArray_DIMS(numpy_data)[0]; i++) {
   assert(PyArray_Check(data[i]));
   double * const sub_data = (double *) PyArray_DATA(data[i]);
}
_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to