【问题标题】:random matrix with sum of values by column not greater than one列值之和不大于一的随机矩阵
【发布时间】:2018-04-30 19:45:57
【问题描述】:

我被 numpy 中的矩阵困住了。 我需要创建矩阵,其中每列的总和不大于一。

np.random.rand(3,3).round(2)

给予

array([[ 0.48,  0.73,  0.81],
       [ 0.4 ,  0.01,  0.32],
       [ 0.44,  0.4 ,  0.92]])

有没有一种聪明的方法来生成具有随机数的矩阵,其中每列的总和不大于一? 谢谢!

【问题讨论】:

  • 你能按列标准化值吗?这样一来,所有列的总和为 1?
  • 或者,更一般地说,通过随机值 0 按列的总和不会大于 1 ?

标签: python numpy matrix


【解决方案1】:

你可以这样做:

x = np.random.rand(3,3)
x /= np.sum(x, axis=0)

这背后的基本原理是您将每一列除以所有值的总和。这样可以确保所有列都加到 1。

或者,你可以这样做:

x = np.random.rand(3,3)/3

因为每个数字都在 [0,1] 之间。如果将域压缩到 [0,1/3],则保证总和为

当您希望限制数字但仍希望它们是随机的时,通常不清楚您的意思。

【讨论】:

    【解决方案2】:

    你总是可以确保你的价值观开始受到限制:

    >>> numcols=3
    >>> np.random.uniform(0,1/numcols,9).reshape(3,3)
    array([[ 0.26718273,  0.29798534,  0.0309619 ],
           [ 0.10923526,  0.12371555,  0.03797226],
           [ 0.15974434,  0.02435774,  0.30885667]])
    

    对于方阵,它的好处是(也许不是?)它也可以同时在行上工作。但是你不能有(0,0,1) 的行。

    【讨论】:

      【解决方案3】:

      按随机值 0

      >>> for i in range(3): a[:,i] = a[0,i] * a[:,i] / np.sum(a[:,i])
      >>> a
      array([[0.02041667, 0.42772512, 0.01939597],
             [0.07875   , 0.17109005, 0.0433557 ],
             [0.04083333, 0.35118483, 0.10724832]])
      >>> np.sum(a,axis=0)
      array([0.14, 0.95, 0.17])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-08
        • 2017-08-26
        • 2012-01-01
        • 2020-02-17
        • 2012-12-03
        • 2017-02-09
        相关资源
        最近更新 更多