我想创建一个大小为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。
答案 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]