关于for循环和reduce的Python之谜

标签 python numpy lambda functional-programming

我正在尝试计算可执行文件的字节熵。在将直方图作为数组后,我首先使用 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)

关于关于for循环和reduce的Python之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54671940/

相关文章:

python - 如何读取多个csv文件并合并它们?

python - jupyter Notebook的Python3环境无法导入已安装的包

python - 将 Pandas 数据框列中的值映射到数字序列

python - 如何在乘法和使用正确的 .replace 时避免重复

c# - C# 中的适当柯里化(Currying)

python - lambda 与 tkinter 的工作方式很奇怪

python - 当使用重复参数而不是链接过滤器时,如何对 Q 对象进行 AND 查找?

python - 如何将字符串变量缺失值的长度计算为零?

python - 将 numpy 数组置换为 ndarray 或矩阵

data-structures - 如何使用经典的自定义数据结构作为 Java 8 流