我从二维分布中生成一个随机样本,但是我得到了这个运行时错误。有人能告诉我如何解决这个错误吗? 这是错误消息:
ValueError Traceback(最近一次调用最后一次) in() 25#接受/拒绝比较 26如果x< P(X,Y): ---> 27个样本[已接受] = x,y 28接受+ = 1 29
ValueError:使用序列设置数组元素。
P = lambda x, y: np.exp(-x**2-y**2-x**2*y**2)
# domain limits
xmin = -2 # the lower limit of our domain
xmax = 2 # the upper limit of our domain
# range limit (supremum) for y
ymin = -2
ymax = 2
N = 10000 # the total of samples we wish to generate
accepted = 0 # the number of accepted samples
samples = np.zeros(N)
count = 0 # the total count of proposals
# generation loop
while (accepted < N):
# pick a uniform number on [xmin, xmax) (e.g. 0...10)
x = np.random.uniform(xmin, xmax)
# pick a uniform number on [0, ymax)
y = np.random.uniform(ymin,ymax)
# Do the accept/reject comparison
if x < P(x,y):
samples[accepted] = x,y
accepted += 1
count +=1
print count, accepted
# get the histogram info
hinfo = np.histogram(samples,30)
# plot the histogram
plt.hist(samples,bins=30, label=u'Samples', alpha=0.5);
# plot our (normalized) function
xvals=np.linspace(xmin, xmax, 1000)
plt.plot(xvals, hinfo[0][0]*P(xvals), 'r', label=u'P(x)')
# turn on the legend
plt.legend()
答案 0 :(得分:0)
这一行:
samples[accepted] = x,y
是问题所在。 samples
的类型为np.ndarray,具有特定的dtype
。可能是np.float
。 numpy
期待一个号码,但获得tuple(x,y)
。可能你打算创建一个2D数组:
samples = np.zeros((N,2))
然后你的代码应该可行,但我还没有深入了解它实际上要做的事情。
我看到你在生成数字时循环N
。这是一个人从另一种编程语言中获取numpy / scipy的典型特征。我想敦促你在阵列中思考#34;。这更优雅,更快:
x = np.random.uniform(xmin,xmax,(N,2))
y = np.random.uniform(ymin,ymax,(N,2))
accepted = x < P(x,y)
samples[accepted] = x[accepted]
上面的代码取代了整个while
循环。