从gaussian_kde_resample数组中获取范围内的数字

1 投票
3 回答
661 浏览
提问于 2025-04-18 09:44

我有一个叫做 gaussian_kde.resample 的数组。我不确定它是不是一个 numpy 数组,所以我能不能用 numpy 的一些功能。

我有 3000 个变量的数据,范围是 0<x<=0.5,我用了:

kde = scipy.stats.gaussian_kde(x) # can also mention bandwidth here (x,bandwidth)
sample = kde.resample(100000) # returns 100,000 values that follow the prob distribution of "x"

这样我得到了一个样本数据,它遵循了 "x" 的概率分布。但问题是,不管我选择什么样的带宽,我在我的 "sample" 中得到的负值都很少。我只想要范围在 0 < sample <= 0.5

我尝试这样做:

 sample = np.array(sample) # to convert this to a numpy array
 keep = 0<sample<=0.5
 sample = sample[keep] # using the binary conditions

但是这不管用!我该怎么才能把数组中的负值去掉呢?

3 个回答

2

我知道我回答得有点晚,大概晚了三年,但这可能对将来有帮助。

问题在于,虽然 kde.resample(100000) 从技术上讲返回的是一个NumPy数组,但这个数组实际上里面又包含了另一个数组!这就导致你在尝试用索引来获取样本的子集时遇到麻烦。为了得到 resample() 方法本来应该返回的那个数组,你可以这样做:

sample = kde.resample(100000)[0]

这样,变量 sample 就会包含所有的100000个样本,并且用索引访问这个数组应该就能正常工作了。

至于为什么SciPy会这样做,我就不知道了。这种问题似乎也没有被记录下来。

2

首先,你可以通过在Python中使用'type'这个命令来检查变量的类型:

x = kde.resample(10000)
type(x)
numpy.ndarray

其次,你写的方式应该是可以工作的,但我建议你在二元条件上更明确一些:

print x
array([[ 1.42935658, 4.79293343, 4.2725778 , ..., 2.35775067, 1.69647609]]) 
x.size
10000
y = x[(x>1.5) & (x<4)]

这样你就可以看到,正确的二元条件会去掉大于1.5和小于4的值:

print y
array([ 2.95451084, 2.62400183, 2.79426449, ..., 2.35775067, 1.69647609])
y.size
5676
1

首先,kde.resample的返回值是一个numpy数组,所以你不需要再把它转换回来。

问题出在这一行(编辑:不,这行应该是可以工作的!)

keep = 0 < sample <= 0.5

它的表现可能和你想的不一样。试试:

keep = (0 < sample) * (sample <= 0.5)

撰写回答