Я создаю последовательность регулярных интервалов, которые наивно можно было бы определить с помощью этого простого кода:
l=6 # Number of elements
h=1 # Spatial regular interval
v=[-h/2] # First element
for i in range(l,start=1):
v.append(v[-1]+h)
Я использую для этого np.arange
, как в:
np.arange(-h/2, h*(l-.5), h)
но в документации говорится, что np.linspace
следует использовать np.linspace
потому что я не использую intergers.
np.linspace(-h/2, h*(l-.5), l, endpoint=False)
Не подходит ли этот подход?
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
вы столкнетесь с аналогичными проблемами, которые вы можете увидеть в этом другом ответе.