Цель
Я хочу применить «относительное» округление к элементам массива 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?