[SciPy-user] C extension to manipulate sparse lil matrix
Andy Fraser
afraser at lanl.gov
Mon Jan 12 15:36:43 EST 2009
>>>>> "A" == Andy Fraser <afraser at lanl.gov> writes:
A> I want to move some time critical bits of code for hidden
A> Markov models from python to C. [...]
A> Now, I am trying to figure out how to manipulate lil sparse
A> matrices. In particular calling such a matrix "SM", and
A> supposing that "t" is the index for a row, I want to assign new
A> arrays to "SM.rows[t]" and "SM.data[t]".
A> I would be grateful if someone posted C code that interchanged
A> two rows of a lil sparse matrix. [...]
I've answered my own question. I append the code below. I found that
lil matrices consist of numpy arrays of python lists. I also found
that I could replace the python lists with numpy arrays. Here are
some resources that helped:
http://www.tramy.us/ Oliphant's "Guide to Numpy"
http://docs.python.org/extending/
http://docs.python.org/c-api/memory.html
http://www.scipy.org/Cookbook/C_Extensions/NumPy_arrays
http://docs.python.org/c-api/arg.html#arg-parsing
Here is code that swaps "rows":
static PyObject *
hmm_test1(PyObject *self, PyObject *args)
/* Python equivalent of:
def test1(A_O # An array of objects like the "rows" of a sparse lil matrix
):
temp = A_O[0]
A_O[0] = A_O[1]
A_O[1] = temp
return
*/
{
PyObject **object0, **object1, *temp;
PyArrayObject *A_O;
if (!PyArg_ParseTuple(args, "O&",
PyArray_Converter, &A_O
))
return NULL;
object0 = PyArray_GETPTR1(A_O, 0);
object1 = PyArray_GETPTR1(A_O, 1);
temp = *object0;
*object0 = *object1;
*object1 = temp;
return Py_BuildValue(""); /* return None */
}
More information about the SciPy-User
mailing list