gpt4 book ai didi

python - 读取文本文件并计算概率和香农熵

转载 作者:太空狗 更新时间:2023-10-29 23:58:34 35 4
gpt4 key购买 nike

我有一个文本文件(制表符分隔),我需要计算文本文件中每一列的概率和熵。这是我的文本文件的样子:

aaa 0.0520852296    0.1648703511    0.1648703511
bbb 0.1062639955 0.1632039268 0.1632039268
ccc 1.4112745088 4.3654577641 4.3654577641
ddd 0.4992644913 0.1648703511 0.1648703511
eeee 0.169058175 0.1632039268 0.1632039268

因此我可以使用以下代码计算概率:

import pandas as pd
f=open(mydata,'r')
df = pd.DataFrame(pd.read_csv(f, sep='\t', header=None, names=['val1', 'val2', 'val3']))
print(df)
df.loc[:,"val1":"val3"] = df.loc[:,"val1":"val3"].div(df.sum(axis=0), axis=1)
print(df)

哪些输出,

aaa 0.0232736716    0.0328321936    0.0328321936
bbb 0.0474828153 0.0325003428 0.0325003428
ccc 0.6306113983 0.8693349271 0.8693349271
ddd 0.2230904597 0.0328321936 0.0328321936
eeee 0.0755416551 0.0325003428 0.0325003428

在那个输出上我想计算熵并将结果作为输出文件给我,所以我有以下代码

import math
entropy = - sum([ p * math.log(p) / math.log(2.0) for p in df ])

但是我收到以下错误信息:

TypeError: a float is required

非常感谢任何帮助。谢谢大家

最佳答案

你的问题出在这一行

entropy = - sum([ p * math.log(p) / math.log(2.0) for p in df ])

如果您考虑(或打印出)p for p in df 给您的是什么(例如运行 print([p for p in df])),您可以看到 p 仅包含列的标题。因此,您将文本标签传递给需要 floatmath 函数。因此错误。

apply在这里可能很适合你:

import math

def shannon(col):
entropy = - sum([ p * math.log(p) / math.log(2.0) for p in col])
return entropy

sh_df = df.loc[:,'val1':'val3'].apply(shannon,axis=0)

print(sh_df)

注意事项

正如其他人所指出的,您可能希望通过将第 0 列作为索引来整理您的数据框——这样您就不必使用

df.loc[:,'val1':'val3']

因此您可以使用以下方式导入数据:

df = pd.read_csv(f, sep='\t', header=None, index_col=0, names=['val1', 'val2', 'val3'])

并避免使用繁琐的 loc[:,'val1':'val3'] 语法

关于python - 读取文本文件并计算概率和香农熵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31075772/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com