用指数给出的变概率生成numpy中的随机二进制数组

2024-05-29 07:33:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个对称矩阵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)

我希望Xiith元素的概率为1,如果i == k,概率为m1,如果i != k,概率为m2

我编写了一些使用嵌套for循环的工作代码,但我希望使用纯numpy来实现这一点。有什么建议吗

以下是当前效率低下的实现,跳过了我定义AlabelsM的部分:

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)

Tags: inforlabelsisnp矩阵标签数组
1条回答
网友
1楼 · 发布于 2024-05-29 07:33:59

您可以单独对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

相关问题 更多 >

    热门问题