Невозможно извлечь десятичное число из массива, созданного с помощью np.linspace в операторе if - PullRequest
0 голосов
/ 07 января 2020

Если я запускаю следующий код, он не распознает несколько чисел в массиве, например 0.1, даже если он выглядит так: 0.1 находится в массиве при печати. ​​

import numpy as np

pH = 0.1

print(np.linspace(0.0, 2.9, num=30))

if pH in np.linspace(0.0, 2.9, num=30):
    print("it doesn't recognize 0.1")

pH = 0.3

if pH in np.linspace(0.0, 2.9, num=30):
    print('however it does recognize 0.3')

Вывод:

[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]
however, it does recognize 0.3

Ответы [ 2 ]

1 голос
/ 07 января 2020

Эта ошибка в основном связана с тем, что NumPy и Python несколько привередливы , когда дело доходит до хранения и, следовательно, сравнения целых чисел с плавающей запятой.

Мы можем видим, что python 0.1 на самом деле:

>>> print('{0:.20f}'.format(0.1))
0.10000000000000000555

, а NumPy 0.1 на самом деле:

>>> import numpy as np
>>> print('{0:.20f}'.format(np.linspace(0.0, 2.9, num=30)[1])) # 0.1 in list
0.09999999999999999167

Поэтому, чтобы правильно сравнить их, Вы можете использовать предоставленные math.isclose () или numpy .isclose () (сравнивает два списка):

import math

# -- snip --

for num in np.linspace(0.0, 2.9, num=30):
    if math.isclose(0.1, num):
        print('detected!')
0 голосов
/ 07 января 2020

Кажется, что значение, отображаемое массивом numpy, отличается от фактического значения. Вероятно, из-за точности с плавающей запятой . Если вам нужен способ обойти это, вы можете использовать понимание списка.

import numpy as np

pH = 0.1

print(np.linspace(0.0, 2.9, num=30))

if pH in [round(x, 5) for x in np.linspace(0.0, 2.9, num=30)]:
    print("it does recognize 0.1")
...