From: Michael H. <mh...@al...> - 2009-03-03 05:34:19
|
Xaver Wurzenberger wrote: > Hi guys, > > I'm sorry to bring this up again, but I'm about to publish my code and I'd > really love to get this straight/fixed. In case you don't remember, I'm > trying to plot high precision numbers (float64, that is), but gnuplot.py > converts them to float32 arrays. > Michael Haggerty told me to 'workaround' by using numpy double arrays, but it > seems that's not working here. I think the problem might be here: > (/usr/share/pyshared/Gnuplot/utils.py, line 20ff) > >> def float_array(m): >> """Return the argument as a numpy array of type at least 'Float32'. >> >> Leave 'Float64' unchanged, but upcast all other types to >> 'Float32'. Allow also for the possibility that the argument is a >> python native type that can be converted to a numpy array using >> 'numpy.asarray()', but in that case don't worry about >> downcasting to single-precision float. >> >> """ >> >> try: >> # Try Float32 (this will refuse to downcast) >> return numpy.asarray(m, numpy.float32) >> except TypeError: >> # That failure might have been because the input array was >> # of a wider data type than float32; try to convert to the >> # largest floating-point type available: >> # NOTE TBD: I'm not sure float_ is the best data-type for this... >> try: >> return numpy.asarray(m, numpy.float_) >> except TypeError: >> # TBD: Need better handling of this error! >> print "Fatal: array dimensions not equal!" >> return None > > If I understand this correctly, the line >> return numpy.asarray(m, numpy.float32) > is supposed to raise a TypeError if you give a numpy.float64 array. > However, my python shell doesn't: > >> (00:13:52)xaver@siduxbox:~$python >> Python 2.5.4 (r254:67916, Feb 18 2009, 03:00:47) >> [GCC 4.3.3] on linux2 >> Type "help", "copyright", "credits" or "license" for more information. >>>>> import numpy >>>>> a = numpy.array( [2.000000001,3.0,4.0] ) >>>>> a.dtype >> dtype('float64') >>>>> numpy.asarray(a, numpy.float32) >> array([ 2., 3., 4.], dtype=float32) > > Am I doing sth wrong? Can anyone confirm that? I don't see that you are doing anything wrong. That array-conversion code was written long ago, originally for Numeric (not numpy). Apparently numpy behaves differently than Numeric in this situation, resulting in a Gnuplot.py bug. I suggest that you try to find the right incantation for Gnuplot.py to do this conversion without losing precision, and submit a patch to Gnuplot.py. Michael |