我编写了以下函数:
def searchPosotive (X,y, num): pos = sample(list(compress(X, y)), num) return (pos)
这个函数接受两个numpy矩阵,X
和y
。这两个数组是相关的,即X[i]
是y[i]
的标签。标签要么是1,要么是0。
这个函数会从X中随机选择num
个值,这些值对应的y
值等于1,并返回一个(num, n)
的数组,其中n是X
的列数。
我需要得到包含这些值的索引列表。例如,如果pos[a] == X[a]
,那么a
需要在这个列表中。我该如何做到这一点?
我还需要对寻找负样本时进行同样的操作。我当前使用的函数是:
def searchNegative (X,y, num): mat=X[y==0] rows = np.random.choice(len(mat), size=num,replace=False) mat=mat[rows,:] return (mat)
回答:
你可以使用np.where
来获取你的正(或负)Y的索引。然后,从这些索引中进行抽样。这里是一个用于正样本的函数,你可以修改它来选择正样本或负样本,或者为负样本编写另一个函数:首先,假设:
>>> yarray([1, 0, 1, 1, 1, 0, 0, 1, 0, 1])>>> Xarray([[-25, 62, 94, 70, 96, 70, 38, -18, -57, 1], [ 40, 86, -98, -48, 40, 29, 4, -83, 44, -12], [ 57, 23, -96, 97, -24, -93, -33, -64, 61, 15], [ 44, 29, 31, -38, 11, 85, 37, -96, -37, -70], [-10, -37, -24, -66, 27, -44, -16, -50, 3, -91], [-97, 81, 52, 41, 39, -14, 95, 76, 28, -32], [-74, 49, -91, -65, -96, 86, -13, 43, 22, 80], [ 5, 20, -77, 74, -89, 46, -90, 95, 30, 13], [ 36, 6, 55, -74, -49, -66, 38, 37, -84, 28], [-23, -28, -32, -30, -4, -52, -4, 99, -67, -98]])
因此…
>>> def sample_positive(X, y, num):... pos_index = np.where(y == 1)[0]... rows = np.random.choice(pos_index, size=num, replace=False)... mat = X[rows,:]... return (mat, rows)...>>> X_sample, idx = sample_positive(X, y, 2)>>> X_samplearray([[-23, -28, -32, -30, -4, -52, -4, 99, -67, -98], [-10, -37, -24, -66, 27, -44, -16, -50, 3, -91]])>>> idxarray([9, 4])>>> Xarray([[-25, 62, 94, 70, 96, 70, 38, -18, -57, 1], [ 40, 86, -98, -48, 40, 29, 4, -83, 44, -12], [ 57, 23, -96, 97, -24, -93, -33, -64, 61, 15], [ 44, 29, 31, -38, 11, 85, 37, -96, -37, -70], [-10, -37, -24, -66, 27, -44, -16, -50, 3, -91], [-97, 81, 52, 41, 39, -14, 95, 76, 28, -32], [-74, 49, -91, -65, -96, 86, -13, 43, 22, 80], [ 5, 20, -77, 74, -89, 46, -90, 95, 30, 13], [ 36, 6, 55, -74, -49, -66, 38, 37, -84, 28], [-23, -28, -32, -30, -4, -52, -4, 99, -67, -98]])>>> yarray([1, 0, 1, 1, 1, 0, 0, 1, 0, 1])