Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 二维numpy阵列的加权随机抽样_Python_Arrays_Numpy_Random_Sampling - Fatal编程技术网

Python 二维numpy阵列的加权随机抽样

Python 二维numpy阵列的加权随机抽样,python,arrays,numpy,random,sampling,Python,Arrays,Numpy,Random,Sampling,我有一个2d numpy数组Z,我想随机选择一个索引Z,其中一个索引被选择的概率与该索引处的Z值成正比 现在,我正在做以下工作: yar = list(np.ndenumerate(Z)) x,y = yar[np.random.choice(len(yar), p=Z.ravel()/Z.sum())][0] 做这项工作,但感觉很可怕(而且速度非常慢)。有更好的方法吗?我们可以优化以避免创建yar。我们只需从np.random.choice中得到线性索引等价物,将其转换为np.unlavel

我有一个2d numpy数组Z,我想随机选择一个索引Z,其中一个索引被选择的概率与该索引处的Z值成正比

现在,我正在做以下工作:

yar = list(np.ndenumerate(Z))
x,y = yar[np.random.choice(len(yar), p=Z.ravel()/Z.sum())][0]

做这项工作,但感觉很可怕(而且速度非常慢)。有更好的方法吗?

我们可以优化以避免创建
yar
。我们只需从
np.random.choice
中得到线性索引等价物,将其转换为
np.unlavel_index
的维度索引,得到
x
y

因此,实施将是-

linear_idx = np.random.choice(Z.size, p=Z.ravel()/float(Z.sum()))
x, y = np.unravel_index(linear_idx, Z.shape)
为了说明创建
yar
导致设置瓶颈的数字,下面是一个计时测试示例-

In [402]: Z = np.random.randint(0,9,(300,400))

In [403]: yar = list(np.ndenumerate(Z))

In [404]: %timeit list(np.ndenumerate(Z))
10 loops, best of 3: 46.3 ms per loop

In [405]: %timeit yar[np.random.choice(len(yar), p=Z.ravel()/float(Z.sum()))][0]
1000 loops, best of 3: 1.34 ms per loop

In [406]: 46.3/(46.3+1.34)
Out[406]: 0.971872376154492
因此,创建
yar
消耗了运行时的
97%

查看wighted random,可能会有所帮助