从numpy数组复制值以平衡数据集

时间:2019-04-22 14:05:41

标签: python numpy dataset

我有一个数据集,其中看起来相似的类之一是不平衡的。这是一个数字数据集,其中类别标签的范围是1到10。

在训练集上按标签(y)分组可以得到以下输出:

(array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10], dtype=uint8), array([13861, 10585,  8497,  7458,  6882,  5727,  5595,  5045,  4659,
    4948]))

可以看出113861个数据点,而7只有5595个数据点。

为了避免17之间的类不平衡,我想为7类添加一些额外的图像。

此处设置了train

from scipy.io import loadmat

train = loadmat('train.mat')

extra = loadmat('extra.mat')

trainextra都是字典,每个字典有2个键Xy

以下是trainextra的形状:

train['X'] --> (32, 32, 3, 73257)
# 73257 images of 32x32x3
train['y'] --> (73257,1)
# 73257 labels of corresponding images

extra['X'] --> (32, 32, 3, 531131)
# 531131 images of 32x32x3
extra['y'] --> (531131, 1)
# 531131 labels of corresponding images

现在,我想用train中的标签更新extra数据集,主要是将x%7中标签为extra的数据{{1} }}。我该怎么办?

我尝试了以下操作:

train

但是我收到一个错误,说arr, _ = np.where(extra['y'] == 7) c = np.concatenate(X_train, extra['X'][arr])

1 个答案:

答案 0 :(得分:1)

这是仅用于numpy数组的有效示例,可以轻松转换为您的情况。编辑完毕后,使用numpy.whereextra['y']上查找所需的标签并保留这些索引。然后将它们与numpy.append一起使用,以将原始数据集与多余的数据连接起来(X的最后一个轴和y的第一个轴)。

import numpy as np

np.random.seed(100)

# First find the indices of your y_extra with label 7
x_extra = np.random.rand(32, 32, 3, 10)
y_extra = np.random.randint(0, 9, size=(10,1))
indices = np.where(y_extra==7)[0] # indices [3,4] are 7 with seed=100

# Now use this indices to concatenate them in the original datase
np.random.seed(101)
x_original = np.random.rand(32, 32, 3, 10)
y_original = np.random.randint(1, 10, size=(10,1))

print(x_original.shape, x_extra[..., indices].shape) # (32, 32, 3, 10) (32, 32, 3, 2)
print(y_original.shape, y_extra[indices].shape) # (10, 1) (2, 1)

x_final = np.append(x_original, x_extra[..., indices], axis=-1)
y_final = np.append(y_original, y_extra[indices], axis=0)

print(x_final.shape, y_final.shape) # (32, 32, 3, 12) (12, 1)