различные linspaces или aranges, которые все включают точные 0.0 - PullRequest
0 голосов
/ 09 ноября 2018

Легко ли сгенерировать два диапазона linspace, идущих от нижнего отрицательного предела до верхнего положительного предела, которые оба содержат 0,0 как точное значение?

Вот пример того, как это терпит неудачу:

>>> r1=np.arange(-.3,.6,.1)
>>> r2=np.arange(-.5,.5,.1)
>>> r1
array([ -3.00000000e-01,  -2.00000000e-01,  -1.00000000e-01,
         5.55111512e-17,   1.00000000e-01,   2.00000000e-01,
         3.00000000e-01,   4.00000000e-01,   5.00000000e-01])
>>> r2
array([ -5.00000000e-01,  -4.00000000e-01,  -3.00000000e-01,
        -2.00000000e-01,  -1.00000000e-01,  -1.11022302e-16,
         1.00000000e-01,   2.00000000e-01,   3.00000000e-01,
         4.00000000e-01])
>>> r1[3]
5.5511151231257827e-17
>>> r2[5]
-1.1102230246251565e-16

Я бы хотел, чтобы r1 [3] и r2 [5] были точно 0.0 (при условии IEEE-754). Единственный обходной путь, который я вижу, - это создание диапазонов [-x0,0 [и добавление [0, x1]. Есть ли лучший способ, который легче читать?

1 Ответ

0 голосов
/ 09 ноября 2018

Вы можете сгенерировать целочисленный диапазон и умножить на любой масштабный коэффициент:

r1 = np.arange(-3, 6) * 0.1

Или для большей точности (хотя это не повлияет на 0), избегайте шага округления путем деления на точное значение 10,0 вместо умножения на неточное значение 0,1:

r1 = np.arange(-3, 6) / 10.0

Использование arange с аргументами с плавающей точкой, как правило, плохая идея. Обычно лучше использовать numpy.linspace, но если вам нужно точно 0 в качестве одного из элементов, linspace не дает достаточно сильных обещаний:

>>> numpy.linspace(-2, 1, 148)[::49]
array([-2.00000000e+00, -1.00000000e+00, -2.22044605e-16,  1.00000000e+00])
>>> (numpy.arange(-2*49, 50) / 49)[::49]
array([-2., -1.,  0.,  1.])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...