Finding frequency of range of numbers in Mathematica
给定Mathematica中的数字列表,我将如何从该列表中提取我指定的数字a
和b
之间的数字总数?
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-#)]&
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]
another approach is
NumberOfNumbers[lst_?ListQ, lwr_?NumberQ, upr_?NumberQ] :=
Length@Select[lst, (lwr <= # <= upr) &]
D
链接地址: http://www.djcxy.com/p/35618.html