numpy log2零屏蔽仅在函数外起作用

iszxjhcz  于 2023-02-16  发布在  其他
关注(0)|答案(1)|浏览(130)

我正在尝试实现一个快速熵计算一个浮动的概率列表。
我尝试使用numpy内置的屏蔽功能来屏蔽零,而不是循环遍历一个列表,每次都检查是否为零。它工作得非常好,除非我尝试将它放入一个函数中,在这一点上它会崩溃。有什么建议吗?

# Works fine!!
distribution = np.array([0.20, 0.3, 0.25, 0.25, 0])

log_dist = np.log2(distribution, out=np.zeros_like(distribution), where=(distribution!=0))
entropy = -np.sum(distribution * log_dist)

print(entropy)
# Breaks!
def calculate_entropy(distribution):
    
    log_dist = np.log2(distribution, out=np.zeros_like(distribution), where=(distribution!=0))
    entropy = -np.sum(distribution * log_dist)
    
    return entropy

calculate_entropy([0.20, 0.3, 0.25, 0.25, 0])

输出:nan
错误信息:/var/文件夹/bt/vk3t9rnn2jz5d1wgj2rc3v200000gn/T/我的内核_61321/2272953976.py:3:运行时警告:在log2中遇到被零除的情况log_dist = np.log2(分布,输出= np. zeros_like(分布),其中=(分布!= 0))/var/文件夹/bt/vk3t9rnn2jz5d1wgj2rc3v200000gn/T/ipykernel_61321/2272953976.py:4:运行时警告:在乘数熵=-np. sum(分布 * log_dist)中遇到无效值
我原以为功能会完全一样,我错过了什么?

g52tjvyc

g52tjvyc1#

啊,我是个白痴。我忘了把列表转换成numpy数组。修复:

def calculate_entropy(distribution):

    distribution = np.array(distribution)
    log_dist = np.log2(distribution, out=np.zeros_like(distribution), where=(distribution!=0))
    entropy = -np.sum(distribution * log_dist)
    
    return entropy

calculate_entropy([0.20, 0.3, 0.25, 0.25, 0])

相关问题