首页 > 解决方案 > 关于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。

标签: pythonnumpylambdafunctional-programming

解决方案


你的初始值是不同的。在循环版本中您首先应用calc_entropy(0, prob[0]),但使用 reduce 您的第一个应用程序是calc_entropy(prob[0], prob[1]). 您可以通过reduce使用初始值调用来更改它:reduce(calc_entropy, prob, 0)


推荐阅读