Возможная ошибка в подпрограмме numpy np.in1d ​​() - PullRequest
0 голосов
/ 28 января 2020

Я тестировал подпрограмму numpy np.in1d(), чтобы проверить, работает ли она должным образом, потому что мне нужно включить ее в программу. А именно я пробовал

>>> import numpy as np
>>> x = np.arange(0, 1, 0.1)
>>> y = np.arange(0.5, 1, 0.2)
>>> x
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
>>> y
array([0.5, 0.7, 0.9])
>>> np.in1d(x, y)
array([False, False, False, False, False,  True, False, False, False, False])

Результат последней оценки, похоже, является ошибкой. Из того, что указано в документах , я ожидал бы, что вместо этого

array([False, False, False, False, False,  True, False, True, False, True])

Я работаю с Python 3.7.3 и NumPy 1.16.1. Первый раз, когда я попробовал это сделать, был в командной строке, а затем скопировал вышеупомянутый MWE в IDLE, чтобы увидеть, была ли это ошибка или что-то, но результат был идентичным.

Это известная проблема? Это проблема с тем, как numpy определяет dtype для np.arange()? Или это что-то еще, например, версия Python / numpy?


РЕДАКТИРОВАТЬ: я попытался сделать ту же операцию, но с целыми числами, и результат, как я и ожидал. В частности, я сделал:

>>> x = np.arange(10)
>>> y = np.arange(5, 10, 2)
>>> np.in1d(x, y)
array([False, False, False, False, False,  True, False,  True, False, True])

Это заставляет меня подозревать, что это ошибка, связанная с dtype массива.

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Это не проблема с np.in1d, а скорее имеет отношение к реализации чисел с плавающей запятой. К сожалению, десятичные числа обычно не могут быть точно выражены в двоичном коде конечной длины, поэтому в числах с плавающей точкой есть небольшие неточности. Проверьте сами:

print(x[7],y[1]) #result: 0.7000000000000001 0.7 
print(x[9],y[2]) #result: 0.9 0.8999999999999999
0 голосов
/ 28 января 2020

Это способ numpy .arange округляет числа. Когда вы сделаете это, вы сможете увидеть это более четко:

y[2]

Output 0.8999999999999999  

и

x[9]

Output 0.9

Они не равны. Таким образом, вы получаете False в последней позиции.

Однако, если вы должны построить ndarrays следующим образом:

a = np.array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
b = np.array([0.5, 0.7, 0.9])

, а затем:

np.in1d(a, b)

Вывод:

array([False, False, False, False, False,  True, False,  True, False,
        True])

Вы получите искомый вывод.

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