5

考虑到每个索引都由该数组内部的数字加权,我想从 2D Numpy 数组的索引中进行采样。然而,我知道它的方式numpy.random.choice不会返回索引,而是返回数字本身。有什么有效的方法吗?

这是我的代码:

import numpy as np
A=np.arange(1,10).reshape(3,3)
A_flat=A.flatten()
d=np.random.choice(A_flat,size=10,p=A_flat/float(np.sum(A_flat)))
print d
4

2 回答 2

2

您可以执行以下操作:

import numpy as np

def wc(weights):
    cs = np.cumsum(weights)
    idx = cs.searchsorted(np.random.random() * cs[-1], 'right')
    return np.unravel_index(idx, weights.shape)

请注意,cumsum 是其中最慢的部分,因此如果您需要对同一个数组重复执行此操作,我建议您提前计算 cumsum 并重用它。

于 2013-11-04T00:52:24.157 回答
2

扩展我的评论:调整此处介绍的加权选择方法https://stackoverflow.com/a/10803136/553404

def weighted_choice_indices(weights):
    cs = np.cumsum(weights.flatten())/np.sum(weights)
    idx = np.sum(cs < np.random.rand())
    return np.unravel_index(idx, weights.shape)
于 2013-11-04T00:47:27.547 回答