加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

wolfram-mathematica – 聚合Tally计数器

发布时间:2020-12-14 00:51:04 所属栏目:百科 来源:网络整理
导读:很多时候我发现自己用Tally []计算出现次数,然后,一旦我放弃原始列表,必须添加(和加入)到该计数器列出来自另一个列表的结果. 这通常发生在我计算配置,事件,执行一些离散统计等时. 所以我为Tally聚合定义了一个非常简单但方便的函数: aggTally[listUnTallied
很多时候我发现自己用Tally []计算出现次数,然后,一旦我放弃原始列表,必须添加(和加入)到该计数器列出来自另一个列表的结果.

这通常发生在我计算配置,事件,执行一些离散统计等时.

所以我为Tally聚合定义了一个非常简单但方便的函数:

aggTally[listUnTallied__List:{},listUnTallied1_List,listTallied_List] := 
 Join[Tally@Join[listUnTallied,listUnTallied1],listTallied] //. 
     {a___,{x_,p_},b___,q_},c___} -> {a,{x,p + q},b,c};

这样

l = {x,y,z}; lt = Tally@l;
n = {x};
m = {x,t};

aggTally[n,{}]
  {{x,1}}

aggTally[m,n,2},{y,1},{t,lt]
  {{x,3},{z,1}}

这个功能有两个问题:

1)表现

Timing[Fold[aggTally[Range@#2,#1] &,{},Range[100]];]
  {23.656,Null}
(* functional equivalent to *)
Timing[s = {}; j = 1; While[j < 100,s = aggTally[Range@j,s]; j++]]
  {23.047,Null}

2)它不验证最后一个参数是真正的Tallied列表还是null(尽管对我来说不那么重要)

有简单,优雅,快捷和有效的解决方案吗? (我知道这些要求太多了,但希望是免费的)

也许,这会满足您的需求吗?
aggTallyAlt[listUnTallied__List : {},listTallied : {{_,_Integer} ...}] :=
{#[[1,1]],Total@#[[All,2]]} & /@ 
       GatherBy[Join[Tally@Join[listUnTallied,listTallied],First]

时间要好得多,并且对最后一个arg进行了基于模式的检查.

编辑:

这是一个更快的版本:

aggTallyAlt1[listUnTallied__List : {},_Integer} ...}] :=
Transpose[{#[[All,1,Total[#[[All,All,2]],{2}]}] &@
   GatherBy[Join[Tally@Join[listUnTallied,First]

它的时间安排:

In[39]:= Timing[Fold[aggTallyAlt1[Range@#2,Range[100]];]
Timing[s = {}; j = 1; While[j < 100,s = aggTallyAlt1[Range@j,s]; j++]]

Out[39]= {0.015,Null}

Out[40]= {0.016,Null}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读