如何将数据集的相对频率保存为列表?
How to save the relative frequencies of a data set as a list?
我的数据包含超过一千个值的列表,例如:
[3.481, 2.413, 4.682,...]
并且可以轻松绘制直方图。但是,我想将这些值的相对频率(或每个值出现的概率)保存为列表,并确保频率加起来为 1。我尝试使用
import numpy
numpy.histogram(data, density=None)
但它没有给我我想要的,因为总和不等于 1。并且将密度设置为等于 'True' 将归一化,使得范围内的积分为 1,但我希望 sum 等于 1。任何帮助将不胜感激,我试着到处寻找简单的代码。
这应该可以完成工作。
def rel_freq(x):
freqs = [(x.count(value) / len(x)) for value in set(x)]
return freqs
但是,请注意总和不会正好等于 1,而是类似于 0.9999
,这是因为 floating point error.
np.histogram(x)
函数已经根据 bin 为您提供了 x
中出现的次数。从那里你只需除以 x.size
得到频率:
In [1]: import numpy as np
In [2]: x = np.random.random(1000)
In [3]: counts, bin_edges = np.histogram(x, bins=np.linspace(0.0, 1.0, 10))
In [4]: counts
Out[4]: array([101, 111, 119, 110, 119, 106, 120, 106, 108], dtype=int64)
In [5]: counts / x.size
Out[5]: array([0.101, 0.111, 0.119, 0.11 , 0.119, 0.106, 0.12 , 0.106, 0.108])
In [6]: np.sum(counts) / x.size
Out[6]: 1.0
请注意,正如@prnvbn 指出的那样,浮点运算是不精确的,您可能并不总是得到精确的 1.0 作为结果。
我的数据包含超过一千个值的列表,例如:
[3.481, 2.413, 4.682,...]
并且可以轻松绘制直方图。但是,我想将这些值的相对频率(或每个值出现的概率)保存为列表,并确保频率加起来为 1。我尝试使用
import numpy
numpy.histogram(data, density=None)
但它没有给我我想要的,因为总和不等于 1。并且将密度设置为等于 'True' 将归一化,使得范围内的积分为 1,但我希望 sum 等于 1。任何帮助将不胜感激,我试着到处寻找简单的代码。
这应该可以完成工作。
def rel_freq(x):
freqs = [(x.count(value) / len(x)) for value in set(x)]
return freqs
但是,请注意总和不会正好等于 1,而是类似于 0.9999
,这是因为 floating point error.
np.histogram(x)
函数已经根据 bin 为您提供了 x
中出现的次数。从那里你只需除以 x.size
得到频率:
In [1]: import numpy as np
In [2]: x = np.random.random(1000)
In [3]: counts, bin_edges = np.histogram(x, bins=np.linspace(0.0, 1.0, 10))
In [4]: counts
Out[4]: array([101, 111, 119, 110, 119, 106, 120, 106, 108], dtype=int64)
In [5]: counts / x.size
Out[5]: array([0.101, 0.111, 0.119, 0.11 , 0.119, 0.106, 0.12 , 0.106, 0.108])
In [6]: np.sum(counts) / x.size
Out[6]: 1.0
请注意,正如@prnvbn 指出的那样,浮点运算是不精确的,您可能并不总是得到精确的 1.0 作为结果。