我想创建一个随机的对角矩阵,大小为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。
np.random.choice
来对向量进行抽样。import numpy as np
n=100
vec=np.random.choice([-1,1],n)
mat=np.diag(vec)
您可以结合几个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)
np.diagflat
从其对角线创建对角矩阵。上述两个操作都是向量化的,但对于较大的尺寸,您当然需要知道布尔掩码存在临时数组。这样怎么样:
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]