答案 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
)。最后定义一个函数,例如它需要x
,y
,Nbins
和nth
(所需的百分位数)并返回binned_statistics
给出3个输出:{ {1}}(该二进制文件中所需统计信息的值),statistic
,bin_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百分位数的行显示为红色,此百分位数下的数据显示为蓝色。