Finding frequency of range of numbers in Mathemati

2019-02-13 18:17发布

Given a list of numbers in Mathematica, how would I extract from that list the total number of numbers between numbers a and b that I specify?

4条回答
Anthone
2楼-- · 2019-02-13 18:42

another approach is

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

D

查看更多
Melony?
3楼-- · 2019-02-13 18:44

Here is one approach that you can try:

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

An alternate approach using IntervalMemberQ is

freq[a_, b_, list_] :=
 Total@Boole@IntervalMemberQ[Interval[{a, b}], list]
查看更多
时光不老,我们不散
4楼-- · 2019-02-13 19:02

Please look into BinCount:

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

Out[176]= {4}

Compare with direct count:

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

Out[177]= 4
查看更多
再贱就再见
5楼-- · 2019-02-13 19:06

The most direct way is simply:

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

There are however much faster ways for most data, this one thanks to Carl Woll:

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

Carl Woll's method is particularly fast, but as yoda pointed out, it fails if your list contains zeros, and your range also straddles zero. Here is another method from Kevin J. McCann that handles this case, and is still very fast:

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

As a pure function [data, a, b]:

Tr@UnitStep[(#-#2)*(#3-#)]&
查看更多
登录 后发表回答