我想创建一个大小为n,n
的二维numpy数组M
(即方阵M
),具有以下约束:
- 每一行的和等于1
- 每行的元素都在0到1之间
i
行占主导地位的值位于M[i,i]
入口。
例如,对于一个方阵,它将是这样的M = np.array([[0.88,0.12],[0.13,0.87]])
- (奖励)理想情况下,我希望每一行的条目遵循一些高斯分布,其峰值,对于行
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]])