As useful as it may seem,
numpy.arange() is not a reliable function. I recommend everyone to consider using
numpy.linspace() instead, when possible.
From the documentation, it is pretty clear what arange() should deliver:
should give an array with values
[start,start+step,start+2*step,...] until
start+N*step > stop. "stop"
is not part of the interval, the manual says.
So, let's try:
Ok, this is what you expect: you get
[0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0], and as the documentation says the endpoint, 1.1, is not included.
But, now try
This time you get
[0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1] - the end-point is suddenly included!!!
The problem lies deeply buried in the bit representation of floating numbers. Due to the rule used to determine the number of points in the array, the last element in the output array may be larger than "stop". Actually, the manual is honest enough to mention this, but it makes it a bit hard to trust the output from this function!
It should be said, that the implementation of arange() has been under a lot of debate, regarding this point; see e.g.
http://osdir.com/ml/python.numeric.general/2006-02/threads.html, and search for "arange" on that page. However, no result has come of this, and as a result I recommend that arange() not be used if it can be avoided.
Fortunately, there is an alternative, which actually is even better (ok, it depends a bit on what you are trying to achieve). The function
numpy.linspace() is a bit unknown but very useful, and above all more predictable!
The syntax is very simple (I just paste the result of "help linspace" here, for convenience):
linspace(start, stop, num=50, endpoint=True, retstep=False)
Return evenly spaced numbers over a specified interval.
Returns `num` evenly spaced samples, calculated over the
interval [`start`, `stop` ].
The endpoint of the interval can optionally be excluded.
Parameters
----------
start : {float, int}
The starting value of the sequence.
stop : {float, int}
The end value of the sequence, unless `endpoint` is set to False.
In that case, the sequence consists of all but the last of ``num + 1``
evenly spaced samples, so that `stop` is excluded. Note that the step
size changes when `endpoint` is False.
num : int, optional
Number of samples to generate. Default is 50.
endpoint : bool, optional
If True, `stop` is the last sample. Otherwise, it is not included.
Default is True.
retstep : bool, optional
If True, return (`samples`, `step`), where `step` is the spacing
between samples.
Returns
-------
samples : ndarray
There are `num` equally spaced samples in the closed interval
``[start, stop]`` or the half-open interval ``[start, stop)``
(depending on whether `endpoint` is True or False).
step : float (only if `retstep` is True)
Size of spacing between samples.
Use this function whenever you want to create a sequence of real numbers between a start and an end point, with a specified number of points. This is often more handy than specifying the point spacing, as you must do for arange() anyway.