从gaussian_kde_resample数组中获取范围内的数字
我有一个叫做 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)