我有一个相对较大的数组,例如矩阵是稀疏矩阵,其中元素可以被认为是权重。权重范围从0到500.我想生成一个相同大小的新数组,200x1000,其中新数组的N个元素是随机整数{0,1}。新矩阵中元素为0或1的概率与原始数组的权重成正比 - 权重越高,1与0的概率越高。
换句话说:我想生成一个大小为200x1000的零矩阵,然后根据200x1000的权重矩阵随机选择N个元素以翻转为1。
答案 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)]))