我有从[0,1)范围内生成-10到10的特定值的代码 代码取值为-10到10,并根据其概率将其附加到列表中。例如,-10将被列入列表0次,因为它对应于值0,而10将被放置100次(作为规范化),因为它对应于范围中的1。
以下是代码:
#!/usr/bin/env python
import math
import numpy as np
import matplotlib.pyplot as plt
pos = []
ceilingValue = 0.82
pValues = np.linspace(0.00, ceilingValue, num=100*ceilingValue)
for i in xrange(int(100*ceilingValue)):
p = pValues[i]
y = -11.63*math.log(-2.36279*(p - 1))
for j in xrange(i):
pos.append(y)
avg = np.average(pos)
std = np.std(pos)
hist, bins = np.histogram(pos,bins = 100)
width = 0.7*(bins[1]-bins[0])
center = (bins[:-1]+bins[1:])/2
plt.bar(center, hist, align = 'center', width = width)
plt.show()
问题是直方图会生成准确的图,但某些值会打破趋势。例如,对应于频率计数中的约30个条目的-5.88将在大约70.我认为python看到这两个值并且简单地将它们混合在一起但我不确定如何修复它。但如果只是直方图做错了,那就无所谓了,我真的不需要它。我只需要列表,如果它是正确的。
答案 0 :(得分:3)
我认为潜在的问题是你的bin大小是统一的,而pos
中唯一值之间的差异是指数级的。因此,你总是以奇怪的“尖峰”结束,其中两个附近的唯一值落在同一个bin中,或者许多空的bin(特别是如果你只是增加bin计数以消除'spikes')。
您可以尝试根据pos
中的实际唯一值设置您的展位,以便它们的宽度不均匀:
# the " + [10,]" forces the rightmost bin edge to == 10
uvals = np.unique(pos+[10,])
hist, bins = np.histogram(pos,bins=uvals)
plt.bar(bins[:-1],hist,width=np.diff(bins))
答案 1 :(得分:2)
我相信你很好。我使用bins = 200
代替bins = 100
重新编写代码,然后峰值消失了。我认为你的价值已经陷入了垃圾箱之间的界限。