Ошибка округления числа с плавающей запятой с функцией Numpy isin - PullRequest
1 голос
/ 30 октября 2019

Я пытаюсь использовать функцию isin() из библиотеки Numpy, чтобы найти элементы, которые являются общими в двух массивах.

Кажется довольно простым, но один из этих массивов создан с использованием linspace(), а другой я просто ввел жесткие значения.

Но, похоже, isin() использует == дляего сравнения, и поэтому в результате, возвращаемом методом, отсутствует одно из чисел.

Есть ли способ, с помощью которого я могу обойти это, либо определив свои массивы по-другому, либо используя метод, отличный от isin()?

thetas = np.array(np.linspace(.25, .50, 51))
known_thetas = [.3, .35, .39, .41, .45]
unknown_thetas = thetas[np.isin(thetas, known_thetas, assume_unique = True, invert = True)]

Распечатав три массива, я обнаружил, что.41 все еще находится в третьем массиве, потому что при печати их один за другим мое значение в первом массиве на самом деле равно 0.41000000000000003, что означает == сравнение возвращает False. Каков наилучший способ обойти это?

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Если у вас есть фиксированный абсолютный допуск, вы можете использовать np.around для округления значений перед сравнением:

unknown_thetas = thetas[np.isin(np.around(thetas, 5), known_thetas, assume_unique = True, invert = True)]

Это округляет thetas до 5 десятичных цифр, ноВам решать, насколько близкими должны быть числа, чтобы считать их равными.

0 голосов
/ 30 октября 2019

Мы могли бы использовать np.isclose после расширения одного из этих массивов до 2D для внешнего поиска совпадений isclose и затем выполнить ANY совпадение, чтобы дать нам 1D логическоемассив, который можно использовать для маскирования соответствующего входного массива -

thetas[~np.isclose(thetas[:,None],known_thetas).any(1)]

Чтобы настроить уровень допуска для совпадений, мы могли бы ввести пользовательские значения относительного и абсолютного допуска к np.isclose.

Если вы ищете производительность для больших массивов, мы могли бы оптимизировать память и, следовательно, повысить производительность с реализацией NumPy np.isin с допуском arg для чисел с плавающей точкой с np.searchsorted -

thetas[~isin_tolerance(thetas,known_thetas,tol=0.001)]

Введите значение допуска в tol arg.

...