首页 > 解决方案 > 为两个数组 x 和 y 获得完全相同的乘积的 Pythonic 方法是什么,其中 y 被任意改组?

问题描述

当我将某个函数 product function prod(x) 应用于 x 和 shuffle(x) 时,我试图得到相同的结果,其中 x 是一些任意整数数组,最长为 100,prod(x) 是一个返回的函数x 的条目的乘积,并且 shuffle 是一个返回 x,shuffle 的函数。

IE

我希望 prod(x) == prod(shuffle(x)) 为 True

任何帮助将非常感激。这是一个更具体的问题,我如何才能在下面得到 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)

标签: pythonnumpymathprecisionint64

解决方案


既然您有精度问题,为什么不使用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认为NaNs 相等(将False其设置为您希望nans 被视为不相等)。


推荐阅读