Python как обрабатывать очень маленькие числа - PullRequest
0 голосов
/ 01 июня 2018

Я сравниваю цифры из 2 словарей (общее сравнение ~ 1M).Вот фрагмент кода:

for i in dict1:
    val1 = dict[i]
    val2 = dict2[i]

    if (val1 != 0.000):
        perctg_diff = (val1 - val2)/val1 * 100
        if perctg_diff > 3.0:
            dict3.update({i:(val1,val2,perctg_diff)})
    if (val2 !=0.000):
        perctg_diff = (val2 - val1)/val2 * 100
        if perctg_diff > 3.0:
            dict3.update({i:(val1,val2,perctg_diff)})

Я нахожу процентную разницу и записываю разницу, когда более 3% в dict3.После выполнения сценария я обнаружил, что некоторые цифры в dict3 являются

(1052712, (2.88541545330242e-33, 2.3194405728563e-27, 99.9998755986471))
(1052713, (8.1367737331018e-34, 7.83224080670401e-31, 99.8961118033279))
(1052715, (1.79168848952333e-33, 6.71766997709614e-31, 99.733287211841))
(1052717, (1.03397638198887e-25, 4.49948480152819e-26, 56.4836791255002))
(1400879, (0.0, 1.39114642689358e-36, 100.0))
(1290291, (0.0, 1.89369462623834e-20, 100.0))

Каким эффективным / действенным способом я могу избавиться от округления чисел и игнорировать сравнение, когда числа такие маленькие?

(использование python 2.7 с numpy)

1 Ответ

0 голосов
/ 01 июня 2018

numpy.isclose близко (каламбур) к тому, что вы хотите.Я оцениваю формулу:

абсолют (а - б) <= (атол + ртол * абсолют (б)) </p>

Таким образом, вы можете использовать это для фильтрации ваших данных, с atol наименьшей абсолютной разницей, которую вы хотите учесть, и rtol, установленной на 3%.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...