如图所示,我具有点的2D分布(大致来说是两个np.arraysxy)。

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

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

最佳答案

我终于提出了一个解决方案,该解决方案看起来似乎不是最优雅的,但效果很好:
要估算二维分布的分位数,可以使用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个输出:statistic(所需统计量的值) bin),bin_edgesbinnumber(数据点所在的bin),以及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)


因此,vt.statistic将分别给出定义所需百分位数的曲线的x和y值。

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)


最后,这给出了下面的图:

plt.plot(x,y,'o',color='gray',ms=1,zorder=1)
plt.plot(v,t.statistic,'r-',zorder=3)
plt.plot(x[ii],y[ii],'o',color='blue',ms=1,zorder=2)


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

其中第30个百分位的行以红色显示,该百分位以下的数据以蓝色显示。

关于python - Python:如何找到二维分布点的第n个分位数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49571240/

10-12 21:18