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