Numpy: Преодоление неточности станка с помощью относительного округления - PullRequest
0 голосов
/ 09 июля 2019

Цель

Я хочу применить «относительное» округление к элементам массива numpy.Относительное округление означает здесь, что я округляю до заданного числа значащие цифры, поэтому мне все равно, десятичные это или двоичные числа.

Предположим, нам даны два массива a и b, так что некоторые элементы расположены близко друг к другу.То есть

np.isclose(a, b, tolerance) 

имеет несколько True записей для данного относительного tolerance.Предположим, что мы знаем, что все записи, которые не равны в пределах допуска, отличаются на относительную разницу не менее 100*tolerance.Я хочу получить несколько массивов a2 и b2, чтобы

np.all(np.isclose(a, b, tolerance) == (a2 == b2))

Моя идея состоит в том, чтобы округлить массивы до соответствующей значащей цифры:

a2 = relative_rounding(a, precision)
b2 = relative_rounding(b, precision)

Однако,числа округлены или пол введен не имеет значения, пока цель достигнута.

Пример:

a = np.array([1.234567891234, 2234.56789123, 32.3456789123])
b = np.array([1.234567895678, 2234.56789456, 42.3456789456])

# desired output
a2 = np.array([1.2345679, 2234.5679, 3.2345679])
b2 = np.array([1.2345679, 2234.5679, 4.2345679])

Мотивация

Цель этого упражнения - дать мне возможность работать с четко определенными результатами бинарных операций, чтобы небольшие ошибки не имели значения.Например, я хочу, чтобы на результат np.unique не влияли неточности операций с плавающей запятой.

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

Вопрос

Мне известны подобные вопросы, касающиеся округления до заданных значащих цифр с числовыми значениями и соответствующих решений .Хотя соответствующих ответов может быть достаточно для моих целей, я думаю, что должно быть более простое и более эффективное решение этой проблемы: поскольку числа с плавающей запятой имеют встроенную «относительную точность», можно просто установить наименьшее значение n.значимые двоичные значения в мантиссе равны 0. Это должно быть даже более эффективно, чем обычная процедура округления.Тем не менее, я не знаю, как реализовать это с NumPy.Важно, чтобы решение было векторизованным и более эффективным, чем наивный способ.Есть ли прямой способ прямого манипулирования двоичными файлами массива в numpy?

1 Ответ

3 голосов
/ 09 июля 2019

Это невозможно, за исключением особых случаев, таких как точность нуля (isclose становится эквивалентной ==) или бесконечности (все числа близки друг к другу).

numpy.isclose не является переходным. Мы можем иметь np.isclose(x, y, precision) и np.isclose(y, z, precision), но не np.isclose(x, z, precision). (Например, 10 и 11 находятся в пределах 10% друг от друга, а 11 и 12 находятся в пределах 10% друг от друга, но 10 и 12 не находятся в пределах 10% друг от друга.)

Дайте вышеуказанные isclose отношения для x, y и z, запрошенное свойство потребует, чтобы x2 == y2 и y2 == z2 были истинными, а x2 == z2 - ложными. Однако, == является транзитивным, поэтому x2 == y2 и y2 == z2 подразумевают x2 == z2. Таким образом, запрашиваемая функция требует, чтобы x2 == z2 было и истиной, и ложью, и, следовательно, это невозможно.

...