gpt4 book ai didi

python - 将python字典转换为MATLAB

转载 作者:行者123 更新时间:2023-12-01 09:16:19 25 4
gpt4 key购买 nike

我有一个以这种形式保存文本文件的python词典列表:

TEST BayesianSearch: Fold 1 results: {'AUC': 0.02361111111111111, 'precision': 0.012, 'recall': 0.0034607372805101266, 'map': 0.006173611111111111, 'NDCG': 0.0038391623343341052, 'MRR': 0.024472222222222218, 'F1': 0.005372169077405249, 'HR': 0.048, 'ARHR': 0.02458333333333333}

TEST BayesianSearch: Fold 2 results: {'AUC': 0.034277777777777775, 'precision': 0.016416666666666666, 'recall': 0.003939761087163834, 'map': 0.009020833333333329, 'NDCG': 0.0052255728628175955, 'MRR': 0.035861111111111094, 'F1': 0.006354527945317168, 'HR': 0.06566666666666666, 'ARHR': 0.0359722222222222}

在MATLAB中,


如何找到以TEST BayesianSearch: Fold i results开头的位置,其中i = 1、2、3、4、5?
从这些行中,我如何得出这些数字?

最佳答案

使用Matlab的regular expressions(支持命名捕获组)可以很好地完成此任务。
在Matlab中使用命名捕获组很方便,因为当使用正确的关键字names时,regexp会自动为您创建一个结构,将命名捕获组作为字段。

对于指定了names关键字的字符向量str和正则表达式,文档说明:


  如果str和expression都是字符向量或字符串标量,则输出为1-by-n结构数组,其中n为匹配数。结构字段名称与令牌名称相对应。


我用于此任务的正则表达式如下:

(?:TEST.*?(?=\d\.))(?<AUC>\d*\.\d*)(?:[,\s'a-z:]*)(?<precision>\d*\.\d*)(?:[,\s'a-z:]*)(?<recall>\d*\.\d*)(?:[,\s'a-z:]*)(?<map>\d*\.\d*)(?:[,\s'A-Z:]*)(?<NDCG>\d*\.\d*)(?:[,\s'A-Z:]*)(?<MMR>\d*\.\d*)(?:[,\s'A-Z:]*\d':\s)(?<F1>\d*\.\d*)(?:[,\s'A-Z:]*)(?<HR>\d*\.\d*)(?:[,\s'A-Z:]*)(?<ARHR>\d*\.\d*)

上面的表达式捕获命名捕获组中的所有数字。您可以找到正则表达式here的实时演示。



正则表达式说明:


(?:TEST.*?(?=\d\.))匹配但不捕获TEST,并使用正向先行匹配所有内容,直到第一个数字后跟小数点。
(?<AUC>\d*\.\d*)捕获名为AUC的组,捕获数字,小数点和更多数字。
(?:[,\s'a-z:]*)匹配但不捕获字符类中的所有内容,包括:逗号,空格,撇号,小写ASCII字符和冒号。
(?<precision>\d*\.\d*)捕获名为precision的组,捕获数字,小数点和更多数字。
(?:[,\s'a-z:]*)匹配但不捕获字符类中的所有内容,包括:逗号,空格,撇号,小写ASCII字符和冒号。
(?<recall>\d*\.\d*)捕获名为recall的组,捕获数字,小数点和更多数字。
(?:[,\s'a-z:]*)匹配但不捕获字符类中的所有内容,包括:逗号,空格,撇号,小写ASCII字符和冒号。
(?<map>\d*\.\d*)捕获名为map的组,捕获数字,小数点和更多数字。
(?:[,\s'A-Z:]*)匹配但不捕获字符类中的所有内容,包括:逗号,空格,撇号,大写ASCII字符和冒号。
(?<NDCG>\d*\.\d*)捕获名为NDCG的组,捕获数字,小数点和更多数字。
(?:[,\s'A-Z:]*)匹配但不捕获字符类中的所有内容,包括:逗号,空格,撇号,大写ASCII字符和冒号。
(?<MMR>\d*\.\d*)捕获名为MMR的组,捕获数字,小数点和更多数字。
(?:[,\s'A-Z:]*\d':\s)匹配但不捕获字符类中的所有内容,包括:逗号,空格,撇号,大写ASCII字符和冒号。然后是数字,撇号,冒号和空格。
(?<F1>\d*\.\d*)捕获名为F1的组,捕获数字,小数点和更多数字。
(?:[,\s'A-Z:]*)匹配但不捕获字符类中的所有内容,包括:逗号,空格,撇号,大写ASCII字符和冒号。
(?<HR>\d*\.\d*)捕获名为HR的组,捕获数字,小数点和更多数字。
(?:[,\s'A-Z:]*)匹配但不捕获字符类中的所有内容,包括:逗号,空格,撇号,大写ASCII字符和冒号。
(?<ARHR>\d*\.\d*)捕获名为ARHR的组,捕获数字,小数点和更多数字。




Matlab实现:

使用fileread读取文本文件并实现正则表达式。

关键字names用于返回每个命名令牌的名称和文本。

data = fileread('mytext.txt');
alldata = regexp(data,"(?:TEST.*?(?=\d\.))(?<AUC>\d*\.\d*)(?:[,\s'a-z:]*)(?<precision>\d*\.\d*)(?:[,\s'a-z:]*)(?<recall>\d*\.\d*)(?:[,\s'a-z:]*)(?<map>\d*\.\d*)(?:[,\s'A-Z:]*)(?<NDCG>\d*\.\d*)(?:[,\s'A-Z:]*)(?<MMR>\d*\.\d*)(?:[,\s'A-Z:]*\d':\s)(?<F1>\d*\.\d*)(?:[,\s'A-Z:]*)(?<HR>\d*\.\d*)(?:[,\s'A-Z:]*)(?<ARHR>\d*\.\d*)",'names')


然后,已实现的代码的输出是一个1×2结构数组,其中包含命名的捕获组作为字段。

alldata(1)

AUC: '0.02361111111111111'
precision: '0.012'
recall: '0.0034607372805101266'
map: '0.006173611111111111'
NDCG: '0.0038391623343341052'
MMR: '0.024472222222222218'
F1: '0.005372169077405249'
HR: '0.048'
ARHR: '0.02458333333333333'


alldata(2)

AUC: '0.034277777777777775'
precision: '0.016416666666666666'
recall: '0.003939761087163834'
map: '0.009020833333333329'
NDCG: '0.0052255728628175955'
MMR: '0.035861111111111094'
F1: '0.006354527945317168'
HR: '0.06566666666666666'
ARHR: '0.0359722222222222'


要访问数据,只需使用点符号,例如 alldata(1).AUC
请注意,对于数值计算,您需要将字段从字符向量转换为双精度。

关于python - 将python字典转换为MATLAB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51225317/

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