[Numpy-discussion] C-extensions to numpy - a little help is needed

Mads Ipsen mpi at osc.kiku.dk
Sun Mar 12 04:22:02 CST 2006


I am trying to understand how to write numpy extensions, in order to be
able to do various things fast, that I need in my own apps. I have looked
at the examples from the Numeric package, which I managed to get working
with numpy, so I guess my questions holds for this forum.

There's one detail, that I don't understand in the examples provided with
the Numeric documentation, namely the use of


which is used in the first example but not in the last. Let me be more

In the example, showing how to implement a trace() function, you
access the data using

    array = (PyArrayObject *)
        PyArray_ContiguousFromObject(input, PyArray_DOUBLE, 2, 2);

do some summing to find the trace and then decrement and return the

    return PyFloat_FromDouble(sum);

Now if you look at the other example for the matrix-vector multiply,
the matrix and vector data are accessed using a similar approach

    PyObject *input1, *input2;
    PyArrayObject *matrix, *vector, *result;
    if (!PyArg_ParseTuple(args, "dOO", factor, &input1, &input2))
        return NULL;
    matrix = (PyArrayObject *)
        PyArray_ContiguousFromObject(input1, PyArray_DOUBLE, 2, 2);
    vector = (PyArrayObject *)
        PyArray_ContiguousFromObject(input2, PyArray_DOUBLE, 1, 1);
    result = (PyArrayObject *)
        PyArray_FromDims(1, dimensions, PyArray_DOUBLE);

Then calculate the DGEMV storing the result in result->data and return

    return PyArray_Return(result);

Finally here's my question:
Since the two pointers *matrix and *vector are created just like
*array in the trace() example, how come they are not decremented with
two calls to


Any help is appreciated.

// Mads

More information about the Numpy-discussion mailing list