首页 > 解决方案 > 是否有设置 numpy.linspace 精度的参数?

问题描述

我正在尝试检查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中的元素不兼容。numpynp.linspace()

我搜索了文档,但没有找到任何关于此的内容。

标签: pythonnumpy

解决方案


这不是精度问题np.linspace,而是生成数组中元素类型的问题

np.linspace生成元素,从概念上讲,它们之间的输入范围相等。然而,这些元素随后被存储为精度有限的浮点数,这使得生成过程本身似乎缺乏精度。

通过将dtype参数传递给np.linspace,您可以指定用于存储其结果的浮点类型的精度,这可以提高生成过程的表观精度。

不过,您不应该使用等式运算符来比较浮点数。相反,np.isclosenp.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

推荐阅读