2

我有 numpy 二维数组 P 使得 P[i, j] >= 0 并且所有 P[i, j] 总和为 1。如何选择概率为 P[i, j] 的索引对 (i, j) ?

编辑:我对 numpy 构建功能感兴趣。这个问题有什么问题吗?可能是一维数组?

4

3 回答 3

1
# setup
import bisect
import numpy as np
cs = P.cumsum()

# get random value
r = np.random.uniform()
i, j = divmod(cs.searchsorted(r), P.shape[1])

O(n) 初始设置,O(log n) 选择。

于 2012-10-10T06:19:02.340 回答
1

这是python中的一个简单算法,可以满足您的期望。

让我们以一个等于 [0.1,0.3,0.4,0.2] 的单维数组 P 为例。逻辑可以扩展到任意数量的维度。

现在我们将每个元素设置为它之前的所有元素的总和:P => [0, 0.1, 0.4, 0.8, 1]

使用随机生成器,我们生成介于 0 和 1 之间的数字。假设 x = 0.2。使用简单的二分搜索,我们可以确定 x 在第一个元素和第二个元素之间。我们只为这个 x 值选择第一个元素。

如果仔细观察,0 =< X < 0.1 的机会是 0.1。0.1 =< x < 0.4 的机会是 0.3,依此类推。

对于 2D 数组,最好将其转换为 1D 数组,即使您应该能够实现 2D 数组二进制搜索算法。

于 2012-10-10T01:20:34.553 回答
0

示例设置:

P = np.random.random((20, 10)) # Initializing P matrix
P = P/P.sum() # Normalizing probability matrix

P.ravel()使概率矩阵变平P

ij = np.random.choice(range(P.size), p=P.ravel()) 

ijP告诉使用概率矩阵中的权重随机选择哪个元素P

i, j = np.unravel_index(ij, P.shape) 

i, j是矩阵中所选元素的坐标P

于 2017-04-12T11:01:56.947 回答