Python 生成具有给定(数值)分布矩阵的随机向量

Python 生成具有给定(数值)分布矩阵的随机向量,python,numpy,optimization,pytorch,Python,Numpy,Optimization,Pytorch,我试图想出一种从分布矩阵生成随机向量的快速而智能的方法,就像这里讨论的那样: 但关键的区别在于我有一个分布矩阵,而不仅仅是一个向量 现在很明显,我可以在矩阵中的每个向量上创建一个for循环和循环,但这看起来不是很像python,也不是很快,所以我有点希望有更好的方法 举一个我想做的简单例子: 给定一个单概率矩阵 p = [[0.2, 0.4, 0.4],[0.1, 0.7, 0.2],[0.44, 0.5, 0.06],...] 我想画元素,每个元素在概率矩阵中以概率进行选择。(本质上,我想

我试图想出一种从分布矩阵生成随机向量的快速而智能的方法,就像这里讨论的那样:

但关键的区别在于我有一个分布矩阵,而不仅仅是一个向量

现在很明显,我可以在矩阵中的每个向量上创建一个for循环和循环,但这看起来不是很像python,也不是很快,所以我有点希望有更好的方法

举一个我想做的简单例子: 给定一个单概率矩阵

p = [[0.2, 0.4, 0.4],[0.1, 0.7, 0.2],[0.44, 0.5, 0.06],...]
我想画元素,每个元素在概率矩阵中以概率进行选择。(本质上,我想从我的一个概率矩阵生成一个单热编码)。 例如,考虑到上述概率,它可能是这样的:

t = [2,1,2,...]
我需要对长序列执行此操作,我需要执行数百万次,但每次仅对每个序列执行一次。(用于深度学习的数据扩充)


有人有好的方法吗?

您可以使用逆变换采样。计算p矩阵上的累积分布,对一个大小等于矩阵高度的随机向量进行采样,然后沿累积矩阵的每一行返回最大索引。代码:

p = np.array([[0.2, 0.4, 0.4],[0.1, 0.7, 0.2],[0.44, 0.5, 0.06]])
u = np.random.rand(p.shape[0])
idxs = (p.cumsum(1) < u).sum(1)

我想那会管用的耶!感谢这似乎与mathfux链接中发布的策略相同,而且似乎是一个很好的解决方案。谢谢
np.histogram((p[0].cumsum() < np.random.rand(10000,1)).sum(1), bins=3)
# array([1977, 4018, 4005]), ...