np.arange
работает путем добавления step
к start
и сравнения, если результат равен >= stop
, в этом случае он не будет генерировать это последнее значение (конечную точку), в противном случае повторите операцию.
Проблема состоит в том, что числа с плавающей запятой никогда не могут сравниваться одинаково из-за того, как они представлены в памяти.Возьмем, к примеру, этот пример:
>>> 0.5 + 0.1 + 0.1 + 0.1 < 0.8
True
Такое поведение чисел с плавающей запятой может привести к добавлению step=0.1
к предыдущему сгенерированному значению np.arange
из 0.7
и меньше, чем stop=0.8
.Вот почему иногда arange, кажется, возвращает конечную точку.На самом деле он не возвращает конечную точку, он возвращает число, близкое к конечной точке, например 0.7999999999999999
, которое округляется методом, возвращающим строковое представление числа с плавающей запятой.
Это не относится к np.linspace
когда у вас есть фиксированное количество шагов, потому что вы не будете сравнивать числа с плавающей запятой, а скорее вычислять значение заданного количества шагов.Поэтому, отвечая на ваш вопрос, да, безопасно использовать np.linspace
так, как вы это сделали.Проверьте эту ветку github для получения дополнительной информации.
Обратите внимание, что я сказал, что у вас должно быть фиксированное количество шагов.Если вы пытаетесь рассчитать количество шагов на основе start
и stop
, вы столкнетесь с аналогичными проблемами, как вы можете видеть на этом другом ответе .