首页 文章

在Mathematica中查找数字范围的频率

提问于
浏览
6

给定Mathematica中的数字列表,如何从该列表中提取我指定的数字 ab 之间的总数?

4 回答

  • 1

    您可以尝试以下一种方法:

    freq[a_, b_, list_] := Total@Boole@Cases[list, x_ :> a <= x <= b]
    lst = RandomInteger[10, 20]
    Out = {6, 1, 1, 6, 3, 1, 10, 0, 2, 10, 3, 5, 9, 1, 5, 5, 3, 8, 2, 3}
    
    freq[3, 6, lst]
    Out = 9
    

    使用 IntervalMemberQ 的替代方法是

    freq[a_, b_, list_] :=
     Total@Boole@IntervalMemberQ[Interval[{a, b}], list]
    
  • 1

    另一种方法是

    NumberOfNumbers[lst_?ListQ, lwr_?NumberQ, upr_?NumberQ] := 
     Length@Select[lst, (lwr <= # <= upr) &]
    

    d

  • 10

    请查看BinCount

    In[176]:= BinCounts[Range[30], {{2, 11/2}}]
    
    Out[176]= {4}
    

    与直接计数比较:

    In[177]:= Count[Range[30], x_ /; 2 <= x < 11/2]
    
    Out[177]= 4
    
  • 2

    最直接的方法是:

    Count[data, x_ /; a <= x <= b]
    

    然而,对于大多数数据来说有更快的方法,这要归功于Carl Woll:

    Tr@Unitize@Clip[data, {a, b}, {0, 0}]
    

    卡尔沃尔的方法特别快,但正如尤达指出的那样,如果你的列表中包含零,则它会失败,你的范围也会超过零 . 这是Kevin J. McCann处理这种情况的另一种方法,但仍然非常快:

    Tr@UnitStep[(data - a)*(b - data)]
    

    作为纯函数[data,a,b]:

    Tr@UnitStep[(#-#2)*(#3-#)]&
    

相关问题