# [SOLVED] Python: Range or numpy Arange with end limit include

## Issue

I am looking to get :

input:

``````arange(0.0,0.6,0.2)
``````

output:

``````0.,0.4
``````

I want

``````0.,0.2,0.4,0.6
``````

how do i achieve using range or arange. If not what is alternate ?

## Solution

In short

I wrote a function `crange`, which does what you require.
In the example below, `orange` does the job of `numpy.arange`

``````crange(1, 1.3, 0.1) >>> [1.  1.1 1.2 1.3]
orange(1, 1.3, 0.1) >>> [1.  1.1 1.2]
crange(0.0, 0.6, 0.2) >>> [0.  0.2 0.4 0.6]
orange(0.0, 0.6, 0.2) >>> [0.  0.2 0.4]
``````

Background information

I had your problem a view times as well. I usually quick-fixed it with adding a small value to stop. As mentioned by Kasrâmvd in the comments, the issue is a bit more complex, as floating point rounding errors can occur in numpy.arange (see here and here).

Unexpected behavior can be found in this example:

``````>>> numpy.arange(1, 1.3, 0.1)
array([1. , 1.1, 1.2, 1.3])
``````

To clear up things a bit for myself, I decided to stop using numpy.arange if not needed specifically. I instead use my self defined function `orange` to avoid unexpected behavior. This combines numpy.isclose and numpy.linspace.

Here is the Code

Enough bla bla – here is the code ^^

``````import numpy as np

def cust_range(*args, rtol=1e-05, atol=1e-08, include=[True, False]):
"""
Combines numpy.arange and numpy.isclose to mimic
open, half-open and closed intervals.
Avoids also floating point rounding errors as with
>>> numpy.arange(1, 1.3, 0.1)
array([1. , 1.1, 1.2, 1.3])

args: [start, ]stop, [step, ]
as in numpy.arange
rtol, atol: floats
floating point tolerance as in numpy.isclose
include: boolean list-like, length 2
if start and end point are included
"""
# process arguments
if len(args) == 1:
start = 0
stop = args
step = 1
elif len(args) == 2:
start, stop = args
step = 1
else:
assert len(args) == 3
start, stop, step = tuple(args)

# determine number of segments
n = (stop-start)/step + 1

# do rounding for n
if np.isclose(n, np.round(n), rtol=rtol, atol=atol):
n = np.round(n)

# correct for start/end is exluded
if not include:
n -= 1
start += step
if not include:
n -= 1
stop -= step

return np.linspace(start, stop, int(n))

def crange(*args, **kwargs):
return cust_range(*args, **kwargs, include=[True, True])

def orange(*args, **kwargs):
return cust_range(*args, **kwargs, include=[True, False])

print('crange(1, 1.3, 0.1) >>>', crange(1, 1.3, 0.1))
print('orange(1, 1.3, 0.1) >>>', orange(1, 1.3, 0.1))
print('crange(0.0, 0.6, 0.2) >>>', crange(0.0, 0.6, 0.2))
print('orange(0.0, 0.6, 0.2) >>>', orange(0.0, 0.6, 0.2))
``````