Создание последовательности регулярно расположенных чисел

1

Я создаю последовательность регулярных интервалов, которые наивно можно было бы определить с помощью этого простого кода:

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)

Не подходит ли этот подход?

Теги:
numpy

1 ответ

1
Лучший ответ

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 вы столкнетесь с аналогичными проблемами, которые вы можете увидеть в этом другом ответе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню