Python 生成二元随机矩阵,每行有一个数的上限和下限?
我想生成一个包含M行和N列的二进制数字矩阵。每行总和必须等于q。换句话说,每一行必须最多有p个,至少有q个 这是我一直在使用的代码Python 生成二元随机矩阵,每行有一个数的上限和下限?,python,numpy,random,Python,Numpy,Random,我想生成一个包含M行和N列的二进制数字矩阵。每行总和必须等于q。换句话说,每一行必须最多有p个,至少有q个 这是我一直在使用的代码 import numpy as np def randbin(M, N, P): return np.random.choice([0, 1], size=(M, N), p=[P, 1 - P]) MyMatrix = randbin(200, 7, 0.5) 请注意,第0行全部为零: 我注意到有些行全是零,有些行全是一。我如何修改它以得到我想要的
import numpy as np
def randbin(M, N, P):
return np.random.choice([0, 1], size=(M, N), p=[P, 1 - P])
MyMatrix = randbin(200, 7, 0.5)
请注意,第0行全部为零:
我注意到有些行全是零,有些行全是一。我如何修改它以得到我想要的?有没有一种有效的方法来实现这个解决方案?好吧,那么:均匀分布就足够容易了。让我们以需要[2,5]1的情况为例。使用允许的组合列表:
[ [1, 1, 0, 0, 0, 0],
[1, 1, 1, 0, 0, 0],
[1, 1, 1, 1, 0, 0],
[1, 1, 1, 1, 1, 0] ]
对于每一行,从这四行中选择一个随机元素,然后将其洗牌。这是您的行。好吧,那么:均匀分布就足够容易了。让我们以需要[2,5]1的情况为例。使用允许的组合列表:
[ [1, 1, 0, 0, 0, 0],
[1, 1, 1, 0, 0, 0],
[1, 1, 1, 1, 0, 0],
[1, 1, 1, 1, 1, 0] ]
对于每一行,从这四行中选择一个随机元素,然后将其洗牌。这是您的行。您可以在[q,p]中为每行生成一个随机数,然后在每行中设置许多随机数。如果你说的有效是指矢量化,那么是的,有一种有效的方法。诀窍是在一个轴上模拟采样,而不替换另一个轴。这可以通过以下方式完成。通过将随机向量转换为掩码,可以选择数量可变的索引
def randbin(m, n, p, q):
# output to assign ones into
result = np.zeros((m, n), dtype=bool)
# simulate sampling with replacement in one axis
col_ind = np.argsort(np.random.random(size=(m, n)), axis=1)
# figure out how many samples to take in each row
count = np.random.randint(p, q + 1, size=(m, 1))
# turn it into a mask over col_ind using a clever broadcast
mask = np.arange(n) < count
# apply the mask not only to col_ind, but also the corresponding row_ind
col_ind = col_ind[mask]
row_ind = np.broadcast_to(np.arange(m).reshape(-1, 1), (m, n))[mask]
# Set the corresponding elements to 1
result[row_ind, col_ind] = 1
return result
您可以在[q,p]中为每一行生成一个随机数,然后在每一行中设置多个随机数。如果你说的有效是指矢量化,那么是的,有一种有效的方法。诀窍是在一个轴上模拟采样,而不替换另一个轴。这可以通过以下方式完成。通过将随机向量转换为掩码,可以选择数量可变的索引
def randbin(m, n, p, q):
# output to assign ones into
result = np.zeros((m, n), dtype=bool)
# simulate sampling with replacement in one axis
col_ind = np.argsort(np.random.random(size=(m, n)), axis=1)
# figure out how many samples to take in each row
count = np.random.randint(p, q + 1, size=(m, 1))
# turn it into a mask over col_ind using a clever broadcast
mask = np.arange(n) < count
# apply the mask not only to col_ind, but also the corresponding row_ind
col_ind = col_ind[mask]
row_ind = np.broadcast_to(np.arange(m).reshape(-1, 1), (m, n))[mask]
# Set the corresponding elements to 1
result[row_ind, col_ind] = 1
return result
请澄清这个问题。我不明白,如果允许或类似的话,甚至传播。。。您使用术语random,但没有描述在给定限制下的含义。由于没有明确的例子或描述,我根本不清楚什么样的过程可以解决您的需求。我已经重新表述了这个问题。有了[p,q]约束,您需要什么样的分发。例如,如果[2,5]分为6列,那么您期望的总和分布是什么?它是均匀分布、正态分布还是[0,7]正态分布的一部分?均匀分布和正态分布中的任何一种都适用于我的问题。谢谢你提出这个问题。别忘了选择答案。请澄清问题。我不明白,如果允许或类似的话,甚至传播。。。您使用术语random,但没有描述在给定限制下的含义。由于没有明确的例子或描述,我根本不清楚什么样的过程可以解决您的需求。我已经重新表述了这个问题。有了[p,q]约束,您需要什么样的分发。例如,如果[2,5]分为6列,那么您期望的总和分布是什么?它是均匀分布、正态分布还是[0,7]正态分布的一部分?均匀分布和正态分布中的任何一种都适用于我的问题。谢谢你提出这个问题。别忘了选择答案。太好了。这可能行得通。非常感谢。如果代码是均匀分布的,那么代码会有什么变化。实现起来并不像我预期的那么简单。我在我的回答中加入了你建议的实施。太好了。这可能行得通。非常感谢。如果代码是均匀分布的,那么代码会有什么变化。实现起来并不像我预期的那么简单。我在答复中增加了对你建议的执行。