Python 从2d概率numpy阵列中采样?

Python 从2d概率numpy阵列中采样?,python,numpy,random,Python,Numpy,Random,假设我有一个2d数组ar,如下所示: 0.9, 0.1, 0.3 0.4, 0.5, 0.1 0.5, 0.8, 0.5 我想根据这个概率数组从[1,0]中取样 rdchoice=lambda x:numpy.random.choice([1,0],p=[x,1-x]) 我尝试了两种方法: 1) 首先将其重塑为一维数组,然后使用numpy.random.choice将其重塑为二维: np.array(list(map(rdchoice,ar.reshape)(-1,))).reshape(a

假设我有一个2d数组
ar
,如下所示:

0.9, 0.1, 0.3
0.4, 0.5, 0.1
0.5, 0.8, 0.5
我想根据这个概率数组从[1,0]中取样

rdchoice=lambda x:numpy.random.choice([1,0],p=[x,1-x])
我尝试了两种方法:

1) 首先将其重塑为一维数组,然后使用
numpy.random.choice
将其重塑为二维:

np.array(list(map(rdchoice,ar.reshape)(-1,))).reshape(ar.shape)
2) 使用矢量化功能

func=numpy.vectorize(rdchoice)
func(ar)
但这两种方法都太慢了,我了解到向量化的本质是for循环,在我的实验中,我发现
map
并不比
vectorize


我认为这可以做得更快。如果2d阵列很大,它的速度会非常慢

您应该能够这样做:

>>> p = np.array([[0.9, 0.1, 0.3], [0.4, 0.5, 0.1], [0.5, 0.8, 0.5]])
>>> (np.random.rand(*p.shape) < p).astype(int)
p=np.数组([[0.9,0.1,0.3],[0.4,0.5,0.1],[0.5,0.8,0.5]) >>>(np.random.rand(*p.shape)实际上我可以使用:


np.重塑([np.random.choice([0,1],p=[x,1-x])对于arr.flat],arr.shape中的x有多快)
?回答得好!非常感谢。后续行动。我想知道如果样本不是[0,1],比如说它是[-1,1],是否可能进行进一步的优化。我知道我可以添加一个额外的步骤,首先缩放它,然后添加一个值:Y=2*X-1。但有可能一步到位吗?如果样本是任意的,比如[23,15]?@lerner
np.where(np.random.random(p.shape)
import numpy as np
p = [[0.9, 0.1, 0.3],
     [0.4, 0.5, 0.1],
     [0.5, 0.8, 0.5]]

np.random.binomial(1, p)