Python 随机对角矩阵

Python 随机对角矩阵,python,numpy,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。您可以将几个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。

您可以将几个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)
def random_diagonal(n,概率负=0):
对角线=np.一(n)
对角线[np.random.random(大小=n)

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

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

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

像这样的东西怎么样:

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]
需求


我的第二个选项是修改后的
1,如果i==1,则为-1,表示对角线中的i\u条目]

@CIsForCookies请查看编辑