Re: Re: mx.DateTime 3.2.x and numpy
Jim Vickroy <[email protected]> Wed, 21 Dec 2011 15:34:50 -0700
| Newsgroups | gmane.comp.python.egenix.user |
|---|---|
| Message-ID | <CADb5CejYv8F4jCuzGm_w__HBdnr9i+xAyCbe79rQkK4JjP16OQ@mail.gmail.com> |
On Wed, Dec 21, 2011 at 2:18 PM, V <[email protected]> wrote: > M.-A. Lemburg <mal@...> writes: > > We'll have to install numpy and check the problem. We may well have > > to patch mxDateTime to make it work with numpy, if this uses its > > own coercion mechanism. > > > > Marc-Andre, > > I ran into the very same problem the other day. I have also found the root > of > the problem. It lies in file mx/DateTime/mxDateTime/mxDateTime.c, function > mxDateTime_RichCompare, specifically this little bit of code: > > else if (PyFloat_Compatible(right)) { > /* DateTime op Number -- compare ticks */ > double t1 = PyFloat_AsDouble(right); > double t0 = mxDateTime_AsTicksWithOffset(self, 0, -1); > > if ((t0 == -1.0 || t1 == -1.0) && PyErr_Occurred()) > goto onError; > > cmp = (t0 < t1) ? -1 : (t0 > t1) ? 1 : 0; > } > > Note here that if the thing on the left side of a comparison is an mx > DateTime, > and the thing on the right side of the comparison is a numpy array, this if > clause will trigger (because numpy.ndarray implements a __float__ method), > and > the first thing it will attempt to do is to cast the array to a float. > Now, if > this array contains more than one element, precisely the exception that > Christian observes will occur. > > TypeError: only length-1 arrays can be converted to Python scalars > > I suppose it's somewhat of a numpy fault in that perhaps they shouldn't > implement conversion from array to float, if it doesn't work for arrays > with > more than one element, but that behavior has been in numpy for ages, > whereas I > believe the PyFloat_Compatible check is a semi-new addition to mx DateTime. > > Hope this helps, and hope you guys can find a good resolution to this. For > now, > I have to patch my local version of mx to work around this issue. > > V > > > _______________________________________________________________________ > eGenix.com User Mailing List http://www.egenix.com/ > https://www.egenix.com/mailman/listinfo/egenix-users > For what it is worth, as a mere "lurker" on this list, that is an error in the numpy implementation, and should be reported. My search attempts to find information on a justification for this behavior are so far unsuccessful. >>> a = numpy.arange(5) >>> a array([0, 1, 2, 3, 4]) >>> float(a) Traceback (most recent call last): File "<interactive input>", line 1, in <module> TypeError: only length-1 arrays can be converted to Python scalars >>> a = numpy.arange(1) >>> a array([0]) >>> float(a) 0.0 >>> a = numpy.arange(5) >>> a.astype('float') array([ 0., 1., 2., 3., 4.]) >>> _______________________________________________________________________ eGenix.com User Mailing List http://www.egenix.com/ https://www.egenix.com/mailman/listinfo/egenix-users