python - 关于for循环和reduce的Python之谜
问题描述
我正在尝试计算可执行文件的字节熵。在将直方图作为数组后,我首先使用 for-loop 进行计算。然后我尝试使用 functools.reduce 来固定一点。有趣的是,我从同一个数组和同一个函数中得到了不同的结果,我想知道为什么。
我将它简化为一个简单的循环和两行代码块,但是我不明白为什么其中一个是错误的。我比较了for循环中列表“prob”和“prob”的所有元素,所有值都相同。
calc_entropy = lambda e,p: e - p*math.log(p,256) if (p != .0) else e
prob = hist / bytes_len
e = functools.reduce(calc_entropy, prob)
和
e = .0
for freq in hist:
prob = freq / bytes_len
e = calc_entropy(e,prob)
其中一个给出 0.813826598594107 另一个是 0.8605594205272858。“hist”是一个 numpy.ndarray。
解决方案
你的初始值是不同的。在循环版本中您首先应用calc_entropy(0, prob[0])
,但使用 reduce 您的第一个应用程序是calc_entropy(prob[0], prob[1])
. 您可以通过reduce
使用初始值调用来更改它:reduce(calc_entropy, prob, 0)
。
推荐阅读
- python-3.x - 查找与嵌套字典中的值匹配的所有键,并以这些值作为键创建一个新字典
- firebase - 在 Xamarin.iOS 中为 Google 移动广告支持添加包会导致链接错误
- javascript - 从数组中获取一系列现有成员的最快方法是什么?
- php - 如何在 Symfony 表单中验证上传文件的名称
- python - scikit-learn,线性回归中的分类(但数字)特征
- r - 代码问题:`[.data.frame`(result, , c(setdiff(names(result), names(data))) 中的错误,:选择了未定义的列
- java - 获取所有唯一的子字符串
- scala - 将网站 url 拆分为多列到 scala 数据框
- flutter - 使用自定义令牌的 Firebase 身份验证错误
- java - Android Studio 无法解析 java 库子模块中复合 includeBuild 依赖项的符号