如何为numpy数组中的每个类别随机选择1个样本(整数编码)

Sam*_*ber 1 python numpy

我使用整数编码来表示numpy数组中的类别。但是,我无法弄清楚如何为每个类别抽取 1 个随机样本并返回索引值。

例如,我有一个数组,如:

np.array([2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 1, 1, 1, 0, 1, 0, 0, 2, 2, 1])
Run Code Online (Sandbox Code Playgroud)

我将如何随机抽取 0、1 和 2 并返回每个样本的索引?

Div*_*kar 5

向量化一个整数标签的通用数量 -

# /sf/answers/3634059201/ @Divakar
def random_num_per_grp(L):
    # For each element in L pick a random number within range specified by it
    r1 = np.random.rand(np.sum(L)) + np.repeat(np.arange(len(L)),L)
    offset = np.r_[0,np.cumsum(L[:-1])]
    return r1.argsort()[offset] - offset

# a is input array
sidx = a.argsort()
c = np.bincount(a)
out = sidx[random_num_per_grp(c) + np.r_[0,c[:-1].cumsum()]]
Run Code Online (Sandbox Code Playgroud)

为了简化我们的案例,我们可以跳过random_num_per_grp. 因此,它将是 -return r1.argsort()[offset]然后得到out,它将是 - sidx[random_num_per_grp(c)]

对于负标签,只需按最小值偏移即可。