pythonpython-3.xnumpynumpy-ndarraynumerical-computing

Numpy dtype=int


In the below code .I get the expected results of x1

import numpy as np 
x1 = np.arange(0.5, 10.4, 0.8)
print(x1)
[ 0.5  1.3  2.1  2.9  3.7  4.5  5.3  6.1  6.9  7.7  8.5  9.3 10.1]

But in the code below, when i set dtype=int why the result of x2 is not [ 0 1 2 2 3 4 5 6 6 7 8 9 10] and Instead I am getting the value of x2 as [ 0 1 2 3 4 5 6 7 8 9 10 11 12] where last value 12 overshoots the end value of 10.4.Please clarify my concept regarding this.

import numpy as np 
x2 = np.arange(0.5, 10.4, 0.8, dtype=int)
print(x2)
[ 0  1  2  3  4  5  6  7  8  9 10 11 12]

Solution

  • According to the docs: https://docs.scipy.org/doc/numpy1.15.0/reference/generated/numpy.arange.html

    stop : number End of interval. The interval does not include this value, except in some cases where step is not an integer and floating point round-off affects the length of out.

    arange : ndarray Array of evenly spaced values.
    For floating point arguments, the length of the result is ceil((stop - start)/step). Because of floating point overflow, this rule may result in the last element of out being greater than stop.

    So here the last element will be.

    In [33]: np.ceil((10.4-0.5)/0.8)                                                
    Out[33]: 13.0
    

    Hence we see the overshoot to 12 in case of np.arange(0.5, 10.4, 0.8, dtype=int), since stop=13 in the above case, and the default value is 0,

    hence the output we observe is.

    In [35]: np.arange(0.5, 10.4, 0.8, dtype=int)                                   
    Out[35]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
    

    Hence the better way of generating integer ranges, is to use integer parameters like so:

    In [25]: np.arange(0, 11, 1)                                                    
    Out[25]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10])