【问题标题】:How to randomly sample a matrix in python?如何在python中随机采样矩阵?
【发布时间】:2015-03-23 01:05:10
【问题描述】:

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

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

【问题讨论】:

    标签: python arrays random-sample


    【解决方案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 1s,其中n 是权重矩阵中的对应条目。在这个实现中,权重 1 实际上是 1 或 0 的 50/50 机会。如果您希望 50/50 的机会发生在 250,请使用 outRow.append(random.choice([0 for _ in range(500-entry)] + [1 for _ in range(entry)]))

    【讨论】:

    • 这似乎是逐行考虑权重,而不是在整个权重矩阵中均匀考虑。还是我错过了什么?
    • 不,这就是它的工作方式,不应该是这样吗?
    【解决方案2】:

    这可以用 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
    

    【讨论】:

    • 这比我的摸索要简单得多——我不会想到使用 numpy.uint8。但是,“1”值的数量必须正好是 N。
    【解决方案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

    【讨论】:

      猜你喜欢
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多