有没有一种有效的方法(使用numpy)来生成一个对称随机矩阵,其条目均匀分布在[0,1]中?

最佳答案

下面是一个使用scipy.spatial.distance.squareform的方法:
squareform在对称矩阵的完整形式和“压缩”形式之间来回切换:

>>> full = squareform(np.arange(1,11))
>>> full
array([[ 0,  1,  2,  3,  4],
       [ 1,  0,  5,  6,  7],
       [ 2,  5,  0,  8,  9],
       [ 3,  6,  8,  0, 10],
       [ 4,  7,  9, 10,  0]])
>>> squareform(full)
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

因为它是用距离矩阵设计的,所以对角线为零,所以我们必须手工填写。为此,我们使用einsum来返回对角线的可写视图,
>>> from scipy.spatial.distance import squareform
>>>
>>> N = 5
>>> a = squareform(np.random.random(N*(N-1)//2))
>>> np.einsum('ii->i', a)[:] = np.random.random(N)
>>> a
array([[0.29946651, 0.3636706 , 0.00708741, 0.87536594, 0.62197293],
       [0.3636706 , 0.31774527, 0.05597852, 0.10800514, 0.99871399],
       [0.00708741, 0.05597852, 0.83912235, 0.86241008, 0.01806965],
       [0.87536594, 0.10800514, 0.86241008, 0.11039534, 0.64213608],
       [0.62197293, 0.99871399, 0.01806965, 0.64213608, 0.84755054]])

关于python - 有没有一种有效的方法来生成对称随机矩阵?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56605189/

10-12 17:41