python - 为两个数组 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)
解决方案
既然您有精度问题,为什么不使用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 被视为不相等)。
推荐阅读
- ember.js - Ember g-recaptcha 在刷新时不呈现
- java - Android Put 方法错误
- python - 有条件地解析 JSON 文件
- scala - spark数据框结构中的类型更改
- spring - 在java中执行shell命令行获取变量
- facebook - Facebook 不再返回 all_mutual_friends
- twitter-bootstrap - Bootstrap 4 导航栏活动类
- javascript - Javascript / angularjs中信用卡到期日期验证的正则表达式?
- cordova - 如何在 Meteor 应用程序中添加 Cordova 资源文件(自定义铃声)
- html - Cloudflare 设置 Freenom