Проблема в вашей конечной точке: 3 * 0.1
, которая не считается равной 0.3
(помните, что Python и NumPy используют арифметику с плавающей запятой , где некоторые числа, то есть 0.1
, не могут быть представленыточно).
>>> 3 * 0.1
0.30000000000000004
>>> 0.3
0.3 # or more exactly 0.299999999999999988897769753748...
>>> 3 * 0.1 == 0.3
False
Так что не удивительно, что 0.3
включен, потому что конечная точка (очень немного) больше.
Обратите внимание, что numpy.arange
также содержит формулу, сколько элементов будет в массиве результатов:
ceil((stop - start)/step
>>> (3 * 0.1 - 0)/0.1
3.0000000000000004
>>> ceil(_)
4
Математика с плавающей запятой сложна, особенно при сравнении чисел с плавающей запятой на равенство.Почему бы просто не создать целочисленный массив и создать нужный массив с плавающей точкой путем деления:
>>> import numpy as np
>>> np.arange(0, 3, 1) / 10
array([0. , 0.1, 0.2])
Или функция numpy.linspace
, которая предлагает дополнительные параметры для значений с плавающей запятой:
>>> import numpy as np
>>> np.linspace(0.0, 3 * 0.1, 3, endpoint=False)
array([0. , 0.1, 0.2])