如果我具有要从中采样的直方图给出的经验分布,则scipy函数rv_histogram非常有用。因此,我可以如以下最小示例所示对新数据进行采样:
import scipy.stats
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
x = np.array(range(2,8))
hist_1d = pd.DataFrame(np.array([11., 46., 158., 75., 90., 14.]), index=x)
plt.plot(x + 0.5, hist_1d.values)
dist = scipy.stats.rv_histogram((hist_1d.values.ravel(), np.array(range(2,9))))
plt.hist(dist.rvs(size=500), bins=len(x))
现在我想对这个最小示例中给出的2D分布执行相同的操作:
hist_2d = pd.DataFrame(np.array([[129, 162, 178, 182, 182, 182],
[122, 163, 185, 191, 189, 185],
[115, 164, 192, 200, 197, 189],
[ 94, 136, 158, 162, 157, 152],
[ 74, 108, 124, 125, 118, 116],
[ 53, 80, 90, 88, 79, 80]]),
index=range(2,8), columns=range(8,14))
sns.heatmap(hist_2d)
但是,rv_histogram函数只能获取一维数据-至少我不知道如何传递两个面元边界矢量。这可能吗,还是Python中有类似的功能?
我接受了以下答案,因为它回答了以下问题:无法使用该函数,并且在Scipy / Python数据科学堆栈中未找到类似的函数。
仅供参考,我可以基于Walker Sampling的this实现找到一个可能的解决方案:
from walker import WalkerRandomSampling
keys = list(itertools.product(hist_2d.index, hist_2d.columns))
values = hist_2d.values.flatten()
wrand = WalkerRandomSampling(weights=values, keys=keys)
samples = wrand.random(100000)
hist,_,_ = np.histogram2d(x= samples[:,0], y=samples[:,1], bins=6)
sns.heatmap(hist)
答案 0 :(得分:0)
是的,整个rv_generic
层次结构仅是一维的,并且包含rv_histogram
。