El dl 22 de 01 del 2007 a les 10:07 -0500, en/na Pierre GM va escriure: > Dear All, > I started playing with Pyrex this week-end, to see how easy it would be to > port some subclasses to C. A good thing is that it's not as bad as I was > dreading. I do have a lot of question, however: > > - Can I create a subclass w/ Pyrex ? If yes, how ? I haven't been able to > find > any example in the numerous tutorials I browsed through, and my naive attempt > to: > cdef NewSubclass(ndarray) > didn't work at all.
You should first inform to Pyrex about the definition of ndarray. For this, it's only necessary to declare this in a file (say definitions.pxd): cdef extern from "numpy/arrayobject.h": # Types ctypedef int npy_intp # Classes ctypedef extern class numpy.dtype [object PyArray_Descr]: cdef int type_num, elsize, alignment cdef char type, kind, byteorder, hasobject cdef object fields, typeobj ctypedef extern class numpy.ndarray [object PyArrayObject]: cdef char *data cdef int nd cdef npy_intp *dimensions cdef npy_intp *strides cdef object base cdef dtype descr cdef int flags # The NumPy initialization funtion void import_array() and then include this in your sources: from definitions cimport import_array, ndarray from now on, Pyrex knows about the ndarray object and you should be able to derive a class from it. Note that you should not forget to do a call to import_array() prior to access the numpy machinery. > - I want to create an output ndarray from a given an input sequence/ndarray. > I'm using PyArray_FROM_OTF, which asks me for a dtype. How can I guess the > dtype of the input sequence ? In Python, a numpy.asarray(obj) would do the > trick, the dtype would be set to the maximum possible. Just use the same syntax as in python: cdef ndarray myvar myvar = <ndarray>numpy.asarray(obj) and then you can access myvar as a regular ndarray object. For example: cdef char type mytype = myvar.descr.type That's one of the beauties of pyrex. > > - What'd be a more pyrex-esque way to code the resize and reshape functions ? Again, just use the python flavor: myvar = myvar.reshape((...)) > > - Is there a standard way to deal w/ __getitem__ ? especially when the item > is > not an integer (but a slice or a sequence) ? def __getitem__(self, fieldName): if isinstance(key, int): ... elif isinstance(key, slice): ... elif isinstance(key, (list, tuple)): ... Remember, the pyrex manual is your friend. In particular, for object oriented programmimg with pyrex be sure to have a look at: http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/version/Doc/extension_types.html Cheers, -- Francesc Altet | Be careful about using the following code -- Carabos Coop. V. | I've only proven that it works, www.carabos.com | I haven't tested it. -- Donald Knuth _______________________________________________ Numpy-discussion mailing list Numpy-discussion@scipy.org http://projects.scipy.org/mailman/listinfo/numpy-discussion