Нахождение частоты диапазона чисел в Mathematica - PullRequest
6 голосов
/ 17 мая 2011

Учитывая список чисел в Mathematica, как мне извлечь из этого списка общее число чисел между числами a и b, которые я указал?

Ответы [ 4 ]

10 голосов
/ 17 мая 2011

Самый простой способ - просто:

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

Однако, благодаря Карлу Уоллу, есть гораздо более быстрые способы получения данных:Этот метод особенно быстр, но, как указал yoda, он потерпит неудачу, если ваш список содержит нули, а ваш диапазон также колеблется от нуля.Вот еще один метод от Кевина Дж. Макканна, который обрабатывает этот случай и все еще очень быстр:

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

Как чистая функция [data, a, b]:

Tr@UnitStep[(#-#2)*(#3-#)]&
2 голосов
/ 17 мая 2011

Вот один подход, который вы можете попробовать:

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 голос
/ 17 мая 2011

Пожалуйста, посмотрите на 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
1 голос
/ 17 мая 2011

другой подход

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

D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...