Numpy log2零值掩码函数外正常,函数内失效问题求助
问题原因与解决方法
你忽略了传入函数的是Python列表而非numpy数组。
外部代码中,你先将列表转为np.array,此时distribution != 0会执行元素级布尔比较,得到布尔数组[True, True, True, True, False],np.log2的where参数会仅对True对应的元素计算对数,False的位置保留out参数的0值,逻辑正常运行。
但在函数里,直接传入Python列表时,distribution != 0是Python的整体比较(列表与0直接比较),结果为标量True——这意味着np.log2会对所有元素执行计算,包括最后一个0值。计算log2(0)会触发除以0警告,得到-inf,后续0 * -inf会生成nan,最终求和结果自然是nan。
修复方案
有两种可行的修复方式:
方式一:调用函数时传入numpy数组
calculate_entropy(np.array([0.20, 0.3, 0.25, 0.25, 0]))
方式二:函数内部先转换输入为numpy数组
确保所有操作都是numpy元素级运算,兼容列表和数组输入:
def calculate_entropy(distribution): dist_array = np.asarray(distribution) log_dist = np.log2(dist_array, out=np.zeros_like(dist_array), where=(dist_array != 0)) entropy = -np.sum(dist_array * log_dist) return entropy calculate_entropy([0.20, 0.3, 0.25, 0.25, 0]) # 可正常返回正确熵值
内容的提问来源于stack exchange,提问作者mbeavitt
相关产品推荐
相关产品推荐

