Defining custom types
Jonathan Wang
jontwang at gmail.com
Thu Oct 26 19:37:42 EDT 2006
On 10/26/06, Travis Oliphant <oliphant at ee.byu.edu> wrote:
>
> But, what do you mean "inheriting" from NumPy's double for your scalar
> data-type. This has significant implications. To define a new
> data-type object (that doesn't build from the VOID data-type), you need
> to flesh out the PyArray_Descr * structure and this can only be done in
> C. Perhaps you are borrowing most entries in the structure builtin
> double type and then filling in a few differently like setitem and
> getitem? Is that accurate?
Sorry, I should have been clearer. When I talk about inheritance, I mean of
the type underlying the array. For example, the built-in scalar double array
has an underlying type of PyDoubleArrType_Type. My underlying type is a
separate PyTypeObject. The interesting changes here are to tp_repr, tp_str,
and tp_as_number. The rest of the fields are inherited from
PyDoubleArrType_Type using the tp_base field.
The array itself has another statically defined type object of type
PyArray_Descr, which I'm creating with a PyObject_New call and filling in
with many of the entries from the descriptor returned by
PyArray_DescrFromType(NPY_DOUBLE), while overriding getitem and setitem to
handle PyObject* of type mxDateTime as you guessed.
> The interface used by Array_FromPyScalar does not conform with the
> > documentation's claim that a negative return value indicates an error.
>
> You must be talking about a different function. Array_FromPyScalar is
> an internal function and not a C-API call. It also returns a PyObject *
> not an integer. So, which function are you actually referring to?
>
> > The return code from setitem is not checked. Instead, the code depends
> > on a Python error being set.
This may be true, but how is it a problem?
>
It's just confusing as the documentation indicates that the setitem function
should return 0 for success and a negative number for failure. But within
Array_FromPyScalar, we have:
ret->descr->f->setitem(op, ret->data, ret);
if (PyErr_Occurred()) {
Py_DECREF(ret);
return NULL;
} else {
return (PyObject *)ret;
}
So, someone reading the documentation could return -1 on failure without
setting the Python error flag, and the function would happily continue on
its way and fail to perform the proper casts.
>
> > I seem to be able to load values into the array, but I can't extract
> > anything out of the array, even to print it. In gdb I've verified that
> > loading DateTime.now() correctly puts a float representation of the
> > date into my array. However, if I try to get the value out, I get an
> > error:
> > >>> mxArr[0] = DateTime.now()
> > >>> mxArr[0]
> > Traceback (most recent call last):
> > File "<stdin>", line 1, in ?
> > File "/usr/lib/python2.4/site-packages/numpy/core/numeric.py", line
> > 391, in array_repr
> > ', ', "array(")
> > File "/usr/lib/python2.4/site-packages/numpy/core/arrayprint.py",
> > line 204, in array2string
> > separator, prefix)
> > File "/usr/lib/python2.4/site-packages/numpy/core/arrayprint.py",
> > line 160, in _array2string
> > format = _floatFormat(data, precision, suppress_small)
> > File "/usr/lib/python2.4/site-packages/numpy/core/arrayprint.py",
> > line 281, in _floatFormat
> > non_zero = _uf.absolute(data.compress(_uf.not_equal(data, 0)))
> > TypeError: bad operand type for abs()
> >
> > I'm not sure why it's trying to call abs() on my object to print it.
>
> Because that's the implication of inheriting from a double. It's just
> part of the code that tries to format your values into an array (notice
> the _floatFormat). I actually borrowed this code from numarray so I
> can't speak to exactly what it's doing without more study.
Hmm, so does Numpy ignore the tp_repr and tp_str fields in the PyTypeObject
of the underlying type? I admittedly haven't had a chance to look at this
code closely yet.
> I have a separate PyNumberMethods attached to my object type, copied
> > from the float scalar type, and nb_absolute is set to 0. When I break
> > at the various functions I've registered, the last thing Numpy tries
> > to do is cast my custom data type to an object type (which it does so
> > successfully) via _broadcast_cast.
>
> Don't confuse the Python object associated when an element of the array
> is extracted and the data-type of the array. Also don't confuse the
> PyNumberMethods of the scalar object with the ufuncs. Defining
> PyNumberMethods won't usually give you the ability to calculate ufuncs.
Okay, is my understanding here correct? I am defining two type descriptors:
PyArray_Descr mxNumpyType - describes the Numpy array type.
PyTypeObject mxNumpyDataType - describes the data type of the contents of
the array (i.e. mxNumpyType->typeobj points to this), inherits from
PyDoubleArrType_Type and overrides some fields as mentioned above.
And the getitem and setitem functions are designed to only give/take
PyObject* of type mxDateTime.
I guess it's not clear to me whether the abs() referred to by the error is
an abs() ufunc or the nb_absolute pointer in the PyNumberMethods. Let me try
overriding ufuncs and get back to you...
Perhaps you just want to construct an "object" array of mxDateTime's.
> What is the reason you want to define an mxDateTime data-type?
Currently I am using an object array of mxDateTime's, but it's rather
frustrating that I can't treat them as normal floats internally since that's
really all they are.
Jonathan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20061026/757d7bee/attachment.html>
-------------- next part --------------
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
-------------- next part --------------
_______________________________________________
Numpy-discussion mailing list
Numpy-discussion at lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/numpy-discussion
More information about the NumPy-Discussion
mailing list