如何在python中随机采样矩阵?

时间:2015-01-23 21:49:29

标签: python arrays random-sample

我有一个相对较大的数组,例如矩阵是稀疏矩阵,其中元素可以被认为是权重。权重范围从0到500.我想生成一个相同大小的新数组,200x1000,其中新数组的N个元素是随机整数{0,1}。新矩阵中元素为0或1的概率与原始数组的权重成正比 - 权重越高,1与0的概率越高。

换句话说:我想生成一个大小为200x1000的零矩阵,然后根据200x1000的权重矩阵随机选择N个元素以翻转为1。

3 个答案:

答案 0 :(得分:3)

我也会在这里提出我提出的解决方案:

# for example
a = np.random.random_integers(0, 500, size=(200,1000))
N = 200

result = np.zeros((200,1000))
ia = np.arange(result.size)
tw = float(np.sum(a.ravel()))
result.ravel()[np.random.choice(ia, p=a.ravel()/tw,
                                size=N, replace=False)]=1

其中a是权重数组:也就是说,从数组ia中选择要更改为1的项的索引,加权a

答案 1 :(得分:2)

这可以通过numpy with

来完成
# Compute probabilities as a 1-D array
probs = numpy.float64(weights).ravel()
probs /= numpy.sum(probs)

# Pick winner indexes
winners = numpy.random.choice(len(probs), N, False, probs)

# Build result
result = numpy.zeros(weights.shape, numpy.uint8)
result.ravel()[winners] = 1

答案 2 :(得分:0)

这样的事情应该有效,没有理由变得太复杂:

>>> import random
>>> weights = [[1,5],[500,0]]
>>> output = []
>>> for row in weights:
...     outRow = []
...     for entry in row:
...         outRow.append(random.choice([0]+[1 for _ in range(entry)]))
...     output.append(outRow)
...
>>> output
[[1, 1], [1, 0]]

这会从一个始终只有零的序列中选择一个随机条目,然后选择n 1 s,其中n是权重矩阵中的相应条目。在此实现中,权重为1实际上是1或0的50/50几率。如果您希望在250使用50/50的机会outRow.append(random.choice([0 for _ in range(500-entry)] + [1 for _ in range(entry)]))