随机对角矩阵

时间:2018-02-25 16:54:45

标签: python numpy

我想创建一个大小为n的随机对角矩阵,使得对角线条目中的每个元素有50%的几率为-1,有50%的可能性为1.对此有任何建议吗?

import numpy as np
diagonal_entries = np.random.randint(low = -1, high = 1, size = n)
D = np.diag(diagonal_entries)

然而,问题是`np.random.randint也包含0作为值。我只想要-1和1,不包括0。

3 个答案:

答案 0 :(得分:2)

您可以使用np.random.choice对矢量进行采样

import numpy as np
n=100
vec=np.random.choice([-1,1],n)
mat=np.diag(vec)

答案 1 :(得分:0)

您可以将一些NumPy例程组合起来,以实现这一简洁例程:

def random_diagonal(n, proba_minus=0):
    diagonal = np.ones(n)
    diagonal[np.random.random(size=n) < proba_minus] = -1
    return np.diagflat(diagonal)

随机例程允许您定义具有“-1”的概率,并且例程np.diagflat从其对角线创建对角矩阵。上面的两个操作都是矢量化的,但是对于大尺寸,你当然需要知道布尔掩码有一个临时数组。

答案 2 :(得分:0)

这样的事情:

import numpy as np

diagonal_entries = np.random.randint(low = 0, high = 2, size = 4)
print diagonal_entries
# i*2-1 will map [0,1] -> [2*0-1 == -1, 2*1-1 == 1] == [-1,1]
modified = [i*2-1 for i in diagonal_entries] 
D = np.diag(modified)
print D

我使用了相同的功能,对结果进行了一些修改,以满足您的[-1,1]需求。

我的第二个选项是modified = [1 if i == 1 else -1 for i in diagonal_entries]