2011-05-17 11 views

Respuesta

10

La forma más directa es simplemente:

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

hay maneras por mucho más rápidos para la mayoría de los datos, esta vez gracias a Carl Woll:

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

método de Carl Woll es especialmente rápido, pero como Yoda señaló, falla si su lista contiene ceros, y su rango también se extiende a cero. Aquí es otro método de Kevin J. McCann que maneja este caso, y sigue siendo muy rápido:

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

En función pura [datos, a, b]:

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

Mago: Ah, eso es lo que tienes que hacer con 'Count'. Intenté darle un patrón como 'Cases' y no obligaría. – abcd

+0

Asistente: El segundo enfoque no funcionará cuando 0 esté en su rango. – abcd

2

Aquí es un enfoque que puede probar:

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 

Un enfoque alternativo utilizando IntervalMemberQ es

freq[a_, b_, list_] := 
[email protected]@IntervalMemberQ[Interval[{a, b}], list] 
1

otro enfoque es

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

D

1

favor ver BinCount :

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

Out[176]= {4} 

Comparar con conteo directo:

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

Out[177]= 4 
+0

Sasha, en Mathematica 7 BinCounts es muy lento. ¿Ha sido mejorado esto recientemente? –

+0

Tiempos en una lista de 5 millones de reales: 'Count' = 3,234 Segundos; 'BinCounts' = 39.344 Segundos; 'Clip' = 0.078 Second –

+0

@ Mr.Wizard' BinCounts' mejorado en v8, pero aún pierde 'Count' por un factor de 2 en el timing. – Sasha

Cuestiones relacionadas