如何在python中随机采样一个矩阵?
How to randomly sample a matrix in python?
我有一个比较大的数组,例如200 x 1000.The 矩阵是一个稀疏矩阵,其中元素可以被视为权重。权重范围从 0 到 500。我想生成一个相同大小的新数组,200x1000,其中新数组的 N 个元素是随机整数 {0,1}。新矩阵中元素为 0 或 1 的概率与原始数组的权重成正比 - 权重越高,1 对 0 的概率就越高。
换句话说:我想生成一个大小为 200x1000 的零矩阵,然后根据 200x1000 的权重矩阵随机选择 N 个元素翻转为 1。
这样的事情应该可行,没有理由变得太复杂:
>>> 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 机会。如果您希望 50/50 的机会发生在 250,请使用 outRow.append(random.choice([0 for _ in range(500-entry)] + [1 for _ in range(entry)]))
这可以用 numpy 来完成
# 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
我也会在这里提出我提出的解决方案:
# 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
.[=14加权=]
我有一个比较大的数组,例如200 x 1000.The 矩阵是一个稀疏矩阵,其中元素可以被视为权重。权重范围从 0 到 500。我想生成一个相同大小的新数组,200x1000,其中新数组的 N 个元素是随机整数 {0,1}。新矩阵中元素为 0 或 1 的概率与原始数组的权重成正比 - 权重越高,1 对 0 的概率就越高。
换句话说:我想生成一个大小为 200x1000 的零矩阵,然后根据 200x1000 的权重矩阵随机选择 N 个元素翻转为 1。
这样的事情应该可行,没有理由变得太复杂:
>>> 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 机会。如果您希望 50/50 的机会发生在 250,请使用 outRow.append(random.choice([0 for _ in range(500-entry)] + [1 for _ in range(entry)]))
这可以用 numpy 来完成
# 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
我也会在这里提出我提出的解决方案:
# 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
.[=14加权=]