Python:如何找到点的二维分布的第n个分位数

时间:2018-03-30 08:45:00

标签: python numpy scipy statistics quantile

我有点的2D分布(粗略地说,有两个np.arraysxy),如附图所示。

如何选择属于此类分布的第n个分位数的分布点?

2d-distribution of points

1 个答案:

答案 0 :(得分:1)

我终于找到了一个解决方案,它看起来并不是最优雅的,但它运作得相当好: 要估计二维分布的分位数,可以使用scipy函数binned_statistics,它允许将数据加入 其中一个并计算另一个统计数据。     这是这种功能的文档:     https://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.stats.binned_statistic.html  哪种语法是: scipy.stats.binned_statistic(x, values, statistic='mean', bins=10, range=None)

首先,可以选择要使用的箱数,例如Nbins=100。 接下来,可以定义要作为输入的用户功能     (这是一个如何做的例子:     How to make user defined functions for binned_statistic),这是我的一个函数,它估计该bin中数据的第n个百分位数(我称之为myperc)。最后定义一个函数,例如它需要xyNbinsnth(所需的百分位数)并返回binned_statistics给出3个输出:{ {1}}(该二进制文件中所需统计信息的值),statisticbin_edges(您的数据点位于哪个bin中),还包括binnumber在中心的值bin(x

bin_center

因此,def quantile2d(x,y,Nbins,nth): from numpy import percentile from scipy.stats import binned_statistic def myperc(x,n=nth): return(percentile(x,n)) t=binned_statistic(x,y,statistic=myperc,bins=Nbins) v=[] for i in range(len(t[0])): v.append((t[1][i+1]+t[1][i])/2.) v=np.array(v) return(t,v) v将分别为定义所需百分位数的曲线提供x和y值。

t.statistic

最后,这给出了以下情节:

Nbins=100
nth=30.
t,v=me.quantile2d(x,y,Nbins,nth)
ii=[]
for i in range(Nbins):
    ii=ii+np.argwhere(((t.binnumber==i) & (y<t.statistic[i]))).flatten().tolist()
ii=np.array(ii,dtype=int)

其中第30百分位数的行显示为红色,此百分位数下的数据显示为蓝色。