gpt4 book ai didi

wolfram-mathematica - 聚合 Tally 计数器

转载 作者:行者123 更新时间:2023-12-04 09:37:41 27 4
gpt4 key购买 nike

很多时候我发现自己用 Tally[ ] 来计算出现次数然后,一旦我丢弃了原始列表,就必须将另一个列表中的结果添加(并加入)到该计数器列表中。

这通常发生在我计算配置、出现次数、进行一些离散统计等时。

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

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

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

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

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

aggTally[m, n, lt]
{{x, 3}, {y, 2}, {t, 1}, {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)它不能验证最后一个参数是一个真正的 Tallyed 列表还是 null(不过对我来说不太重要)

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

最佳答案

也许,这将满足您的需求?

aggTallyAlt[listUnTallied__List : {}, listUnTallied1_List, listTallied : {{_, _Integer} ...}] :=
{#[[1, 1]], Total@#[[All, 2]]} & /@
GatherBy[Join[Tally@Join[listUnTallied, listUnTallied1], listTallied], First]

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

编辑:

这是一个更快的版本:
aggTallyAlt1[listUnTallied__List : {}, listUnTallied1_List, listTallied : {{_, _Integer} ...}] :=
Transpose[{#[[All, 1, 1]], Total[#[[All, All, 2]], {2}]}] &@
GatherBy[Join[Tally@Join[listUnTallied, listUnTallied1], listTallied], First]

它的时间:
In[39]:= Timing[Fold[aggTallyAlt1[Range@#2, #1] &, {}, 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}

关于wolfram-mathematica - 聚合 Tally 计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5143575/

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