我想用NumPy创建一个CDF,我的代码如下:
histo = np.zeros(4096, dtype = np.int32)
for x in range(0, width):
for y in range(0, height):
histo[data[x][y]] += 1
q = 0
cdf = list()
for i in histo:
q = q + i
cdf.append(q)
我正在走数组,但是程序执行的时间很长。有一个内置的函数有这个功能,是吗?
6条答案
按热度按时间nhjlsmyf1#
使用直方图是一种解决方案,但它涉及到数据的分组。这对于绘制经验数据的CDF是不必要的。设
F(x)
为小于x
的条目数,然后它增加1,正好是我们看到测量值的位置。因此,如果我们对样本进行分类,则在每个点上我们将计数递增1(或将分数递增1/N)并将一个相对于另一个作图,我们将看到“精确的”(即,未分箱的)经验CDF。下面的代码示例演示该方法
它输出以下内容
83qze16e2#
我不太清楚代码的作用,但是如果
numpy.histogram
返回hist
和bin_edges
数组,则可以使用numpy.cumsum
生成直方图内容的累积和。p3rjfoxz3#
numpy版本1.9.0的更新。user545424的答案在1.9.0中不起作用。
wbrvyc0a4#
为了补充Dan的解决方案,如果样本中有多个相同的值,可以使用numpy.unique:
v09wglhw5#
现有的答案要么诉诸于使用直方图,要么不能很好地/正确地处理重复值(要么忽略重复值,要么生成一个包含同一个x值的多个y值的CDF)。
qvtsj1bj6#
我不确定是否有现成的答案,确切的做法是定义一个函数,如下所示:
会很快的。