Python 生成二元随机矩阵,每行有一个数的上限和下限?

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行全部为零: 我注意到有些行全是零,有些行全是一。我如何修改它以得到我想要的

我想生成一个包含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行全部为零:


我注意到有些行全是零,有些行全是一。我如何修改它以得到我想要的?有没有一种有效的方法来实现这个解决方案?

好吧,那么:均匀分布就足够容易了。让我们以需要[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]正态分布的一部分?均匀分布和正态分布中的任何一种都适用于我的问题。谢谢你提出这个问题。别忘了选择答案。太好了。这可能行得通。非常感谢。如果代码是均匀分布的,那么代码会有什么变化。实现起来并不像我预期的那么简单。我在我的回答中加入了你建议的实施。太好了。这可能行得通。非常感谢。如果代码是均匀分布的,那么代码会有什么变化。实现起来并不像我预期的那么简单。我在答复中增加了对你建议的执行。