我有numpy二维数组P,使得P [i,j]> = 0并且所有P [i,j]总和为1。如何以概率P [i,j]?
选择一对索引(i,j) 编辑:我对numpy构建函数很感兴趣。这个问题有什么问题吗?可能是一维数组?答案 0 :(得分:1)
这是python中的一个简单算法,可以满足您的需求。
让我们以单维数组P为[0.1,0.3,0.4,0.2]。逻辑可以扩展到任意数量的维度。
现在我们将每个元素设置为其前面所有元素的总和: 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数组二进制搜索算法。
答案 1 :(得分: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)选择。
答案 2 :(得分: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())
ij
告诉使用概率矩阵P
P
中的哪个元素
i, j = np.unravel_index(ij, P.shape)
i, j
是矩阵P