我有一个对称矩阵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
,其形状为(30, 3)
。调用此数组的每一行Xi
,及其关联的标签k
(k为0、1或2)
我希望Xi
的ith
元素的概率为1,如果i == k
,概率为m1,如果i != k
,概率为m2
我编写了一些使用嵌套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)
您可以单独对M1和M2进行采样,只需将M1插入到M2中的标签指定的正确位置即可
相关问题 更多 >
编程相关推荐