【发布时间】:2019-07-07 09:21:42
【问题描述】:
我正在尝试计算可执行文件的字节熵。在将直方图作为数组后,我首先使用 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。
【问题讨论】:
-
如果你给
hist和bytes_len我会很好。您可以将 np.random 与 np.random.seed(123) 一起使用。 -
您的
numpy.ndarray hist中的dtype是什么?是float还是整数类型? -
我的猜测:
/的浮点精度是这里的问题。 docs.python.org/2/tutorial/floatingpoint.html -
@AlexYu 它是 numpy.float64
-
@FelixMartinez 但是,循环中的所有“概率”值都等于数组中的相应值。
标签: python numpy lambda functional-programming