Создание диапазона поплавков с numpy arange - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь создать диапазон с плавающей точкой, однако, кажется, что добавление одного шага к диапазону приводит к двум добавленным шагам, любые идеи о том, как решить эту проблему без создания списка целых чисел, а затем деления на 10 (я избегаючто в качестве шага также может быть 0,3)

import numpy as np

amp_start = 0.8
amp_step = 0.1
amp_end = 1.0
amp_end = (np.ceil(amp_end / amp_step)) * amp_step
amp_end_2 = (np.ceil(amp_end / amp_step)) * amp_step + amp_step

print(amp_end)
field_amp_range = np.arange(amp_start, amp_end, amp_step)
field_amp_range_2 = np.arange(amp_start, amp_end_2, amp_step)
field_amp_range = field_amp_range.tolist()
print(amp_end, amp_end_2, field_amp_range, field_amp_range_2)

РЕДАКТИРОВАТЬ: amp_start = 0,8 (или = 0,0) отсутствует

1 Ответ

0 голосов
/ 30 мая 2018

Хотя я не могу воспроизвести его на своем компьютере, это похоже на проблему ошибки округления с плавающей точкой. Документация np.arange:

При использовании нецелого шага, такого как 0,1, результаты часто не будут согласованными.Для этих случаев лучше использовать linspace.

Так что использование linspace, вероятно, лучше.Вот пример использования linspace:

import numpy as np

amp_start = 0.8
amp_step = 0.1
amp_end = 1.0
amp_end = (np.ceil(amp_end / amp_step)) * amp_step
amp_end_2 = (np.ceil(amp_end / amp_step)) * amp_step + amp_step

print(amp_end)
field_amp_range = np.linspace(amp_start, amp_end, np.rint((amp_end-amp_start)/amp_step).astype('int')+1)
field_amp_range_2 = np.linspace(amp_start, amp_end_2, np.rint((amp_end_2-amp_start)/amp_step).astype('int')+1)
field_amp_range = field_amp_range.tolist()
print(amp_end, amp_end_2, field_amp_range, field_amp_range_2)

В качестве альтернативы, если вы действительно хотите продолжать использовать np.arange, и вы уверены, что между начальным и конечным значениями есть целое число шагов, выМожно добавить небольшое число к конечному значению, чтобы округление не имело значения (или вычтите его, если вы не хотите, чтобы конечное значение было включено в ваш список).В этом случае ваш код станет:

import numpy as np
amp_start = 0.
amp_step = 0.1
amp_end = 1.0
amp_end = (np.ceil(amp_end / amp_step)) * amp_step
amp_end_2 = (np.ceil(amp_end / amp_step)) * amp_step + amp_step

print(amp_end)
field_amp_range = np.arange(amp_start, amp_end+amp_step/100, amp_step)
field_amp_range_2 = np.arange(amp_start, amp_end_2+amp_step/100, amp_step)
print(amp_end, amp_end_2, field_amp_range, field_amp_range_2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...