Python中的直方图匹配

Python中的直方图匹配,python,numpy,histogram,cdf,Python,Numpy,Histogram,Cdf,我正在尝试将模拟数据与观测到的降水数据进行直方图匹配。下面是一个简单的模拟案例。我得到了模拟数据和观测数据的CDF,然后被卡住了。我希望有个线索能帮助我理解……先谢谢你 import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import interp1d import scipy.stats as st sim = st.gamma(1,loc=0,scale=0.8) # Simulated ob

我正在尝试将模拟数据与观测到的降水数据进行直方图匹配。下面是一个简单的模拟案例。我得到了模拟数据和观测数据的CDF,然后被卡住了。我希望有个线索能帮助我理解……先谢谢你

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
import scipy.stats as st


sim = st.gamma(1,loc=0,scale=0.8) # Simulated
obs = st.gamma(2,loc=0,scale=0.7) # Observed
x = np.linspace(0,4,1000)
simpdf = sim.pdf(x)
obspdf = obs.pdf(x)
plt.plot(x,simpdf,label='Simulated')
plt.plot(x,obspdf,'r--',label='Observed')
plt.title('PDF of Observed and Simulated Precipitation')
plt.legend(loc='best')
plt.show()

plt.figure(1)
simcdf = sim.cdf(x)
obscdf = obs.cdf(x)
plt.plot(x,simcdf,label='Simulated')
plt.plot(x,obscdf,'r--',label='Observed')
plt.title('CDF of Observed and Simulated Precipitation')
plt.legend(loc='best')
plt.show()

# Inverse CDF
invcdf = interp1d(obscdf,x)
transfer_func = invcdf(simcdf)

plt.figure(2)
plt.plot(transfer_func,x,'g-')
plt.show()

我试图复制您的代码,但出现以下错误:

ValueError: A value in x_new is above the interpolation range.
如果你看一下你的两个CDF的图,就可以很直接地了解到底发生了什么:

现在定义
invcdf=interp1d(obscdf,x)
时,请注意
obscdf
的范围为

>>> obscdf[0]
0.0
>>> obscdf[-1]
0.977852889924409
因此,
invcdf
只能在这些限制之间插值:超出这些限制,我们必须进行外推,而外推的定义并不十分明确。SciPy的默认行为是在被要求进行推断时引发错误。这正是当您请求
invcdf(simcdf)
时发生的情况,因为

>>> simcdf[-1]
0.99326205300091452
超出插值范围

如果您阅读,您将看到此行为可以通过以下方式进行修改:

invcdf = interp1d(obscdf, x, bounds_error=False)
现在一切都很顺利,尽管您需要将绘图参数的顺序颠倒到
plt.plot(x,transfer_func,'g-)
,以获得与您发布的图中相同的结果:


你的问题是什么?你想做什么你做不到的?@Ben,我正在尝试CDF匹配/直方图匹配,如图所示。我无法反转观测数据的CDF,这是下一步。看起来您需要为所需的y值插值CDF,然后用旧的x值绘制它。@tiago,如果您能给出解决方案,我将不胜感激。@subash,我不会为您编写代码。您的示例代码主要是绘图,您似乎没有尝试任何方法来解决此问题。“索取密码不是这么回事儿。@Jaime.”。。非常感谢。我做了建议的更改,可以生成我发布的链接中显示的所有4个图。我接受了你的回答。