Есть ли параметр для установки точности для numpy.linspace? - PullRequest
3 голосов
/ 01 апреля 2019

Я пытаюсь проверить, содержит ли массив numpy конкретное значение:

>>> x = np.linspace(-5,5,101)
>>> x
array([-5. , -4.9, -4.8, -4.7, -4.6, -4.5, -4.4, -4.3, -4.2, -4.1, -4. ,
       -3.9, -3.8, -3.7, -3.6, -3.5, -3.4, -3.3, -3.2, -3.1, -3. , -2.9,
       -2.8, -2.7, -2.6, -2.5, -2.4, -2.3, -2.2, -2.1, -2. , -1.9, -1.8,
       -1.7, -1.6, -1.5, -1.4, -1.3, -1.2, -1.1, -1. , -0.9, -0.8, -0.7,
       -0.6, -0.5, -0.4, -0.3, -0.2, -0.1,  0. ,  0.1,  0.2,  0.3,  0.4,
        0.5,  0.6,  0.7,  0.8,  0.9,  1. ,  1.1,  1.2,  1.3,  1.4,  1.5,
        1.6,  1.7,  1.8,  1.9,  2. ,  2.1,  2.2,  2.3,  2.4,  2.5,  2.6,
        2.7,  2.8,  2.9,  3. ,  3.1,  3.2,  3.3,  3.4,  3.5,  3.6,  3.7,
        3.8,  3.9,  4. ,  4.1,  4.2,  4.3,  4.4,  4.5,  4.6,  4.7,  4.8,
        4.9,  5. ])
>>> -5. in x
True
>>> a = 0.2
>>> a
0.2
>>> a in x
False

Я присвоил константу переменной a.Кажется, что точность a не совместима с элементами в массиве numpy, сгенерированном np.linspace().

Я искал документы , но не сделалнайти что-нибудь об этом.

1 Ответ

3 голосов
/ 01 апреля 2019

Вопрос не в точности np.linspace, а в типе элементов в сгенерированном массиве .

np.linspace генерирует элементы, которые концептуально равномерно делят входной диапазон между ними. Однако эти элементы затем сохраняются в виде чисел с плавающей запятой с ограниченной точностью, что приводит к тому, что самому процессу генерации не хватает точности.

Передав аргумент dtype в np.linspace, вы можете указать точность типа с плавающей запятой, используемого для хранения его результата, что может увеличить кажущуюся точность процесса генерации.

Тем не менее, вы не должны использовать оператор равенства для сравнения чисел с плавающей запятой . Вместо этого используйте np.isclose в сочетании с np.ndarray.any или другим эквивалентом:

>>> floats_64 = np.linspace(-5, 5, 101, dtype='float64')
>>> floats_128 = np.linspace(-5, 5, 101, dtype='float128')
>>> print(0.2 in floats_64)
False
>>> print(floats_64[52])
0.20000000000000018
>>> print(np.isclose(0.2, floats_64).any())  # check if any element in floats_64 is close to 0.2
True
>>> print(0.2 in floats_128)
False
>>> print(floats_128[52])
0.20000000000000017764
>>> print(np.isclose(0.2, floats_128).any())  # check if any element in floats_128 is close to 0.2
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...