2011-05-17 163 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