我试图计算可执行文件的字节熵我第一次使用循环来计算它,是在获取直方图作为数组之后。然后我试着用functools.reduce来固定一下有趣的是,我从同一个数组和同一个函数得到不同的结果,我想知道为什么。
我把它简化为一个简单的循环和两行代码块,但是,我不明白为什么其中一个是错误的。我比较了for循环中list“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 - 关于for循环和减少的Python之谜,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54671940/

10-09 22:01