如图所示,我具有点的2D分布(大致来说是两个np.arrays
,x
和y
)。
如何选择属于该分布的第n个分位数的分布点?
最佳答案
我终于提出了一个解决方案,该解决方案看起来似乎不是最优雅的,但效果很好:
要估算二维分布的分位数,可以使用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
)。最终定义了一个函数,例如它采用x
,y
,Nbins
和nth
(所需的百分位数)并返回binned_statistics
给出3个输出:statistic
(所需统计量的值) bin),bin_edges
,binnumber
(数据点所在的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)
因此,
v
和t.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)
其中第30个百分位的行以红色显示,该百分位以下的数据以蓝色显示。
关于python - Python:如何找到二维分布点的第n个分位数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49571240/