[Numpy-discussion] Weird numpy.arange behavoir

Robert Kern robert.kern@gmail....
Wed Jun 6 22:09:01 CDT 2007


Luke wrote:
> I am integrating some equations and need to generate rank 1 time
> arrays to pass to my integrator.  I need them to have the same
> interval between each entry and have the same number of elements.  In
> matlab this is trivial, and it is in numpy as well, except I'm getting
> some weird behavoir:
> 
> import numpy as N
> T = 0.1
> dt = 0.01
> 
> k=0
> t = N.arange(k*T,(k+1)*T+h,h)
> 
> Output:
> array([ 0.  ,  0.01,  0.02,  0.03,  0.04,  0.05,  0.06,  0.07,  0.08,
> 0.09,  0.1 ])
> 
> So far so good.
> 
> Here is where the problem arises:
> 
> k=1
> t = N.arange(k*T,(k+1)*T+h,h)
> array([ 0.1 ,  0.11,  0.12,  0.13,  0.14,  0.15,  0.16,  0.17,  0.18,
> 0.19,  0.2 ,  0.21])
> 
> Note that this time array has more entries, and in fact, the last
> entry is greater than (k+1)*T = (1+1)*0.01 = 2*0.01 = 0.2
> 
> Now if it was consistent for all k>0, then it would be fine.  However,
> this is not the case:
> 
> k=3
> t = N.arange(k*T,(k+1)*T+h,h)
> 
> Output:
> array([ 0.3 ,  0.31,  0.32,  0.33,  0.34,  0.35,  0.36,  0.37,  0.38,
> 0.39,  0.4 ])
> 
> Now, this one has the same number of entries as the case where k=0.
> 
> Can anybody:
> 1)  Offer a solution to this?

Use linspace() instead.

> 2)  Explain this behavoir would occur and ever be desirable?

It's not that it's desirable; it's just unavoidable.

> I read the numpy.arange docstring and it says that this may occur, but
> I don't understand why you would ever want this to occur.  Apparently,
> the length of the returned array is:
> 
> ceil((stop-start)/step)
> 
> The weird thing is that in this simple example, (stop-start)/step is
> always exactly 11, since ((k+1)*T + h - k*T)/(h) = (T+h)/h =
> (0.1+0.01)/(0.01) = 11.0.  In this, there shouldn't be any roundoff
> error.

Yes, there is. Neither 0.1 nor 0.01 are exactly representable in binary floating
point. There is roundoff error before you ever get to the actual operations.

>  So in this simple example that was harmlessly constructed
> (i.e., my period time was an exact integer multiple of my step time),
> arange behaves undesirably (at least I think it does).
> 
> After a few tests, I found that if instead of ceil, round was used,
> then it eliminated my problem, but I don't know if this would have
> other undesirable effects in other situations.

That just moves the problem elsewhere and is inconsistent with the integer behavior.

-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
 that is made terrible by our own mad attempt to interpret it as though it had
 an underlying truth."
  -- Umberto Eco


More information about the Numpy-discussion mailing list