我有一个对称矩阵 A,其中A.shape = (30, 30)
, 的每一行都A
与 3 个唯一标签中的一个相关联[0, 1, 2]
。
我有另一个矩阵 M:
m1 = .9
m2 = .1
M = np.array([[m1, m2, m2],
[m2, m1, m2],
[m2, m2, m1]])
我想X
用 shape制作一个新数组(30, 3)
。调用此数组的每一行Xi
及其相关标签k
(k 为 0、1 或 2)。
我希望 的ith
元素为Xi
1,概率为 m1 ifi == k
和 m2 if i != k
。
我编写了一些使用嵌套 for 循环的工作代码来执行此操作,但我想使用纯 numpy 执行此操作。有什么建议么?
这是当前效率低下的实现,跳过了我定义A
、labels
和的部分M
:
n_communities = 3
X = []
for i, _ in enumerate(A): # A is a 2d array, shape (30, 30), symmetric
Xi = []
k = labels[i] # labels is an array of length 30, each labels corresponds to a row of A
for ii in range(n_communities):
p = M[k, ii]
Xi.append(np.random.choice([1, 0], p=[p, 1-p]))
X.append(Xi)
X = np.array(X)