2011-05-17 128 views

回答

10

最直接的办法很简单:

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

中多数数据但是快得多的方式,这一个感谢卡尔·沃尔:

[email protected]@Clip[data, {a, b}, {0, 0}] 

卡尔·沃尔的方法特别快,但作为yoda指出,如果你的列表包含零,那么它失败,你的范围也跨过零。下面是从凯文J. McCann的处理这一情况下的另一种方法,并且仍然是非常快:

[email protected][(data - a)*(b - data)] 

作为一个纯粹的函数[数据,A,B]:

[email protected][(#-#2)*(#3-#)]& 
+0

向导:啊,这就是你需要用'Count'做的事情。我试图给它一个'Cases'的模式,它不会强制。 – abcd 2011-05-17 06:36:53

+0

向导:第二种方法在0范围内时不起作用。 – abcd 2011-05-17 06:39:26

2

这是一种方法,你可以尝试:

freq[a_, b_, list_] := [email protected]@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_] := 
[email protected]@IntervalMemberQ[Interval[{a, b}], list] 
1

另一种方法是

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

d

1

请看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 
+0

Sasha,在Mathematica 7 BinCounts中很慢。这最近有所改善吗? – 2011-05-17 06:48:27

+0

500万实物列表上的计时:“计数”= 3.234秒; 'BinCounts' = 39.344秒; 'Clip' = 0.078 Second – 2011-05-17 06:52:46

+0

@ Mr.Wizard'BinCounts'在v8中有所改进,但在时序上依然失去“计数”2倍。 – Sasha 2011-05-17 07:07:10