1

我有一个对称矩阵 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元素为Xi1,概率为 m1 ifi == k和 m2 if i != k

我编写了一些使用嵌套 for 循环的工作代码来执行此操作,但我想使用纯 numpy 执行此操作。有什么建议么?

这是当前效率低下的实现,跳过了我定义Alabels和的部分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)
4

1 回答 1

0

您可以单独对 M1 和 M2 进行采样,只需将 M1 插入 M2 中标签给出的正确位置。

m1_arr = np.random.choice([1, 0], p=[m1, 1-m1], size=(N))
m2_arr = np.random.choice([1, 0], p=[m2, 1-m2], size=(N, 3))
m2_arr[np.arange(N), labels] = m1_arr
X = m2_arr
于 2020-11-18T12:42:32.603 回答