【问题标题】:Creating a 2d numpy array with certain constraints创建具有某些约束的二维 numpy 数组
【发布时间】:2022-06-03 12:41:07
【问题描述】:

我想创建一个二维numpy数组M,大小为n,n(即方阵M),具有以下约束:

  1. 每行之和等于一
  2. 每一行的元素都在0到1之间
  3. 支配的行i的值位于条目M[i,i]

    例如,对于一个方阵,它将类似于 M = np.array([[0.88,0.12],[0.13,0.87]])

    1. (奖励)理想情况下,我希望每行的条目遵循某种高斯分布,其峰值,对于行 i,位于元素 M[i,i]

    this SO thread 中提出了类似的问题。但是,在那里玩响应时,我无法找到解决方法。这是一个搜索问题,我确实理解它可能被表述为一个优化问题。但是,我想知道是否可以在不需要一些专门的求解器的情况下满足这些约束。

    标签: python arrays numpy random constraints


    【解决方案1】:

    对于 1) 和 2):

    M = np.random.rand(n,n)
    x = M / M.sum(1, keepdims=True)
    

    【讨论】:

    • 谢谢,这确实很容易。然而,3d 是棘手的(“奖金”应该到第四点)。
    【解决方案2】:

    我从每个坐标的行数中减去列数,然后用它们计算高斯函数的值,最后乘以一个随机数组并归一化。

    它可能不是那么随机,但它很有可能满足您的要求:

    >>> size = 4
    >>> ii, jj = np.indices((size, size))
    >>> gaussian = np.exp(-((ii - jj) ** 2) / 2)
    >>> result = np.random.normal(1, .1, gaussian.shape) * gaussian
    >>> result /= result.sum(1, keepdims=True)
    >>> result
    array([[0.47556382, 0.38041462, 0.11953135, 0.02449021],
           [0.24805318, 0.4126681 , 0.26168636, 0.07759236],
           [0.10350016, 0.26245839, 0.37168771, 0.26235374],
           [0.02027633, 0.11892695, 0.31971733, 0.54107939]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 2015-10-06
      • 2023-01-04
      • 2019-01-09
      • 2017-11-19
      • 1970-01-01
      相关资源
      最近更新 更多