创建具有一定约束的2d numpy数组



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

  1. 每一行的和等于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]

在这个SO线程中问了一个类似的问题。然而,在那里玩的回应,我无法找到一个方法来做到这一点。这是一个搜索问题,我知道它可以被表述为一个优化问题。然而,我想知道如果不需要一些专门的求解器,是否可以满足这些约束。

For 1) and 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]])

相关内容

  • 没有找到相关文章

最新更新