Каким способом Pythoni c получить точно такой же продукт для двух массивов x и y, где y - произвольно перемешанный x? - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь получить тот же результат, когда применяю, скажем, некоторую функцию продукта function prod (x) к x и shuffle (x), где x - некоторый произвольный массив целых чисел, скажем, до длины 100, prod (x) - это функция, которая возвращает произведение записей x, а shuffle - это функция, которая возвращает x в перемешанном виде.

ie

Я хочу prod (x) == prod (shuffle (x)) чтобы быть истинным

Любая помощь будет принята с благодарностью. Вот более осязаемый вопрос, как я могу получить True ниже?

import numpy as np

x = np.random.randint(100, 1000, 10)

x = np.asarray(x, dtype=np.float64)

xs = np.copy(x)

np.random.shuffle(xs)

y = np.prod(x)

ys = np.prod(xs)

print(y)

print(ys)

print(ys == y)

1 Ответ

1 голос
/ 07 мая 2020

Поскольку у вас есть проблема с точностью, почему бы вам не использовать np.close для проверки в пределах допуска, а не на точное равенство:

#replace (ys == y) with:
np.isclose(ys, y, rtol=1e-15, equal_nan=True)

rtol=1e-10 - относительный допуск (вы можете установить его на свой желаемая относительная ошибка, я рекомендую установить ее на 15 или меньше (около 6 байтов = 48 бит, я думаю, что float64 использует 52 бита для мантиссы, но я не уверен)). Вы можете использовать аргумент atol для абсолютного допуска вместо относительного допуска. equal_nan=True считает NaN s равными (установите False, если вы хотите, чтобы nan s считались не равными).

...