【发布时间】:2014-11-17 01:42:00
【问题描述】:
我有一个大代码,它在某一时刻根据从 probability density function (PDF) 中获取的概率对数组中的值进行采样。
为此,我使用了numpy.random.choice,它在numpy 1.8.0 之前工作得很好。这是一个MWE(文件pdf_probs.txt可以下载here):
import simplejson
import numpy as np
# Read probabilities from file.
f = open('pdf_probs.txt', 'r')
probs = simplejson.load(f)
f.close()
print sum(probs) # <-- Not *exactly* 1. but very close: 1.00000173042
# Define array.
arr = np.linspace(1., 100., len(probs))
# Get samples using the probabilities in probs.
samples = np.random.choice(arr, size=1000, replace=True, p=probs)
问题是在使用numpy 1.9.0 测试后,上面的代码失败并出现错误:
Traceback (most recent call last):
File "numpy_180_vs_190_np_random_choice.py", line 13, in <module>
samples = np.random.choice(arr, size=1000, replace=True, p=probs)
File "mtrand.pyx", line 1083, in mtrand.RandomState.choice (numpy/random/mtrand/mtrand.c:10106)
ValueError: probabilities do not sum to 1
鉴于使用非常小的浮点数时出现的小偏差,PDF 概率的总和不会恰好 1。
据我所知,以前版本的numpy (1.8.0) 显然比新版本的1.9.0 具有更大的容差,但我可能是错的。
为什么这适用于numpy 1.8.0 而不适用于1.9.0?如何使我的代码与新的 1.9.0 版本一起使用?
【问题讨论】:
-
以下是对容差测试的更改:1.9 version vs 1.8 version。
标签: python arrays numpy random floating-accuracy