[Numpy-discussion] #2522 numpy.diff fails on unsigned integers
Charles R Harris
charlesr.harris at gmail.com
Tue Nov 4 13:44:36 EST 2014
On Tue, Nov 4, 2014 at 11:19 AM, Sebastian <sebix at sebix.at> wrote:
> On 2014-11-04 15:06, Todd wrote:
> > On Tue, Nov 4, 2014 at 2:50 PM, Sebastian Wagner <sebix at sebix.at
> > <mailto:sebix at sebix.at>> wrote:
> >
> > Hello,
> >
> > I want to bring up Issue #2522 'numpy.diff fails on unsigned integers
> > (Trac #1929)' [1], as it was resonsible for an error in one of our
> > programs. Short explanation of the bug: np.diff performs a
> subtraction
> > on the input array. If this is of type uint and the data contains
> > falling data, it results in an artihmetic underflow.
> >
> > >>> np.diff(np.array([0,1,0], dtype=np.uint8))
> > array([ 1, 255], dtype=uint8)
> >
> > @charris proposed either
> > - a note to the doc string and maybe an example to clarify things
> > - or raise a warning
> > but with a discussion on the list.
> >
> > I would like to start it now, as it is an error which is not easily
> > detectable (no errors or warnings are thrown). In our case the
> > type of a
> > data sequence, with only zeros and ones, had type f8 as also every
> > other
> > one, has been changed to u4. As the programs looked for values ==1
> and
> > ==-1, it broke silently.
> > In my opinion, a note in the docs is not enough and does not help
> > if the
> > type changed or set after the program has been written.
> > I'd go for automatic upcasting of uints by default and an option
> > to turn
> > it off, if this behavior is explicitly wanted. This wouldn't be
> > correct
> > from the point of view of a programmer, but as most of the users
> > have a
> > scientific background who excpect it 'to work', instead of sth is
> > theoretically correct but not convenient. (I count myself to the
> first
> > group)
> >
> >
> >
> > When you say "automatic upcasting", that would be, for example uint8
> > to int16? What about for uint64? There is no int128.
> The upcast should go to the next bigger, otherwise it would again result
> in wrong values. uint64 we can't do that, so it has to stay.
> > Also, when you say "by default", is this only when an overflow is
> > detected, or always?
> I don't know how I could detect an overflow in the diff-function. In
> subtraction it should be possible, but that's very deep in the
> numpy-internals.
> > How would the option to turn it off be implemented? An argument to
> > np.diff or some sort of global option?
> I thought of a parameter upcast_int=True for the function.
>
Could check for non-decreasing sequence in the unsigned case. Note that
differences of signed integers can also overflow. One way to check in
general is to determine the expected sign using comparisons.
Chuck
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20141104/49be0a8a/attachment.html>
More information about the NumPy-Discussion
mailing list