创建具有某些约束的二维 numpy 数组

Creating a 2d numpy array with certain constraints

我想创建一个二维 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].

中提出了类似的问题。然而,在那里玩弄我无法找到一种方法来做到这一点。这是一个搜索问题,我确实理解它可能被表述为一个优化问题。但是,我想知道是否可以在不需要一些专门求解器的情况下满足这些约束条件。

对于 1) 和 2):

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

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

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

>>> 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]])