【问题标题】:How to sort N lists by the total sum of elements of each list with Mathematica?如何使用 Mathematica 按每个列表的元素总和对 N 个列表进行排序?
【发布时间】:2012-01-17 05:51:37
【问题描述】:

给定一个包含k 子列表的列表,让 A={{a1,a2,a3,...},{b1,b2,b3,...},...},我想按它们的Total[A[i]] 对这些子列表进行排序。有什么有效的方法吗?

【问题讨论】:

    标签: list wolfram-mathematica sorting mathematica-8


    【解决方案1】:

    查看文档中的SortBy,了解对列表进行排序的一系列可能性。

     SortBy[A,Total]
    

    满足您的需求。

    编辑:根据下面向导先生的评论和链接中的解释,

    SortBy[A,{Total}]
    

    更好。

    【讨论】:

    • @Mr Wizard 前几天评论了另一个排序问题,似乎SortBy[A, {Total}] 会稍微快一些。
    • 谢谢@Mike。很有意思;这听起来像是一个老式的 Mr.Wizard 发现。您还记得问题或链接吗?
    • 除了过去 3-4 天的情况以及与排序相关的问题外,其他情况并非如此。现在得走了,否则我会去找它。
    • @kguler 这不是我的发现;它产生了一个稳定的排序,没有平局,就像explained by Andrew Moylan。从逻辑上讲,如果有很多关系,这将更快。它还会改变你得到的结果,所以请注意你在做什么。
    • @Mr.Wizard,非常感谢您提供的链接。我确实注意到结果的变化并对此感到困惑;现在说得通了。
    【解决方案2】:

    请注意,在许多情况下,基于Ordering 的排序可能比SortBy 更快,因为它允许我们利用矢量化。在这种特殊情况下,加速并没有那么大:

    In[50]:= test = RandomInteger[10,{5000000,5}];
    
    In[54]:= (res1=SortBy[test,{Total}]);//Timing
    (res2 = test[[Ordering[Total[test,{2}]]]]);//Timing
    res1===res2
    
    Out[54]= {1.422,Null}
    Out[55]= {1.125,Null}
    Out[56]= True
    

    但是,这是因为Total 是一个内置函数。引入SortBy 的全部原因是效率(即对于单个比较函数。对于作为决胜局的几个比较函数,也方便)。 Sort 更有效,因为它更具体,因此绕过了主评估序列中的更多步骤。但是,SortBy 无法利用排序所基于的函数可能的可列表性(矢量化性质) - 它被逐一应用于列表元素。排序解决方案确实明确利用了排序函数的整体计算的可能性(在这种情况下,Total[#,{2}]& 这样做),因此更快。

    例如,如果任务是根据每个子列表中的第二、第三和第四个元素进行排序,我们会看到更大的性能差异:

    In[60]:= (res3=SortBy[test,{Total[#[[2;;4]]]&}]);//Timing
    (res4=test[[Ordering[Total[test[[All,2;;4]],{2}]]]]);//Timing
    res3==res4
    
    Out[60]= {2.39,Null}
    Out[61]= {1.11,Null}
    Out[62]= True
    

    通常,对于计算密集型和矢量化的排序函数,性能提升最大,因此当应用于整个列表时,它们的速度要快得多。但是请注意,对于大型列表,排序的性能提升永远不会像排序函数本身那样大。这是因为排序的内在复杂性,对于长度为n 的大型列表,它与n*Log[n] 成正比,并且这种复杂性将一直存在。

    【讨论】:

      【解决方案3】:

      以下应该可以工作(但我现在无法测试):

      Sort[A, Total[#1]<Total[#2]&]
      

      【讨论】:

        猜你喜欢
        • 2013-07-07
        • 1970-01-01
        • 2021-07-25
        • 1970-01-01
        • 2023-04-05
        • 2010-09-15
        • 2020-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多