随机对角矩阵

3

我想创建一个随机的对角矩阵,大小为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。

1
@CIsForCookies 请查看编辑。 - JungleDiff
3个回答

3
您可以使用 np.random.choice 来对向量进行抽样。
import numpy as np
n=100
vec=np.random.choice([-1,1],n)
mat=np.diag(vec)

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从其对角线创建对角矩阵。上述两个操作都是向量化的,但对于较大的尺寸,您当然需要知道布尔掩码存在临时数组。

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]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接