在Mathematica中查找数字范围的频率
给定Mathematica中的数字列表,我将如何从该列表中提取我指定的数字a
和b
之间的数字总数?
最直接的方法很简单:
Count[data, x_ /; a <= x <= b]
然而,对于大多数数据来说有更快的方法,这要归功于Carl Woll:
Tr@Unitize@Clip[data, {a, b}, {0, 0}]
Carl Woll的方法特别快,但是如yoda所指出的,如果你的列表包含零,并且你的范围也跨过零,它就会失败。 下面是Kevin J. McCann处理这种情况的另一种方法,它仍然非常快:
Tr@UnitStep[(data - a)*(b - data)]
作为一个纯函数[data,a,b]:
Tr@UnitStep[(#-#2)*(#3-#)]&
以下是您可以尝试的一种方法:
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]
另一种方法是
NumberOfNumbers[lst_?ListQ, lwr_?NumberQ, upr_?NumberQ] :=
Length@Select[lst, (lwr <= # <= upr) &]
d
链接地址: http://www.djcxy.com/p/35617.html