PIck从2D矩阵中随机抽样并将索引保​​存在python中

时间:2017-06-04 12:46:04

标签: python numpy matrix

我有一个带有python数据的numpy 2D矩阵,我想通过保留25%的初始样本来执行下采样。为此,我使用以下random.randint功能:

reduced_train_face = face_train[np.random.randint(face_train.shape[0], size=300), :]

但是,我有一个第二个矩阵,其中包含与面相关的标签,我想以相同的方式减少。怎样,我可以保留简化矩阵的索引并将它们应用到train_lbls矩阵吗?

2 个答案:

答案 0 :(得分:1)

为什么不保留所选索引并使用它们从两个矩阵中选择数据?

import numpy as np

# setting up matrices
np.random.seed(1234)  # make example repeatable 
                      # the seeding is optional, only for the showing the
                      # same results as below!
face_train = np.random.rand(8,3)
train_lbls= np.random.rand(8)

print('face_train:\n', face_train)
print('labels:\n', train_lbls)

# Setting the random indexes
random_idxs= np.random.randint(face_train.shape[0], size=4)
print('random_idxs:\n', random_idxs)

# Using the indexes to slice the matrixes
reduced_train_face = face_train[random_idxs, :]
reduced_labels = train_lbls[random_idxs]
print('reduced_train_face:\n', reduced_train_face)
print('reduced_labels:\n', reduced_labels)

作为输出:

face_train:
 [[ 0.19151945  0.62210877  0.43772774]
 [ 0.78535858  0.77997581  0.27259261]
 [ 0.27646426  0.80187218  0.95813935]
 [ 0.87593263  0.35781727  0.50099513]
 [ 0.68346294  0.71270203  0.37025075]
 [ 0.56119619  0.50308317  0.01376845]
 [ 0.77282662  0.88264119  0.36488598]
 [ 0.61539618  0.07538124  0.36882401]]
labels:
 [ 0.9331401   0.65137814  0.39720258  0.78873014  0.31683612  0.56809865
  0.86912739  0.43617342]
random_idxs:
 [1 7 5 4]
reduced_train_face:
 [[ 0.78535858  0.77997581  0.27259261]
 [ 0.61539618  0.07538124  0.36882401]
 [ 0.56119619  0.50308317  0.01376845]
 [ 0.68346294  0.71270203  0.37025075]]
reduced_labels:
 [ 0.65137814  0.43617342  0.56809865  0.31683612]

答案 1 :(得分:1)

您可以在应用提取之前修复种子:

import numpy as np

# Each labels correspond to the first element of each line of face_train
labels_train =  np.array(range(0,15,3))
face_train = np.array(range(15)).reshape(5,3)
np.random.seed(0)
reduced_train_face = face_train[np.random.randint(face_train.shape[0], size=3), :]
np.random.seed(0)
reduced_train_labels = labels_train[np.random.randint(labels_train.shape[0], size=3)]

print(reduced_train_face, reduced_train_labels)
# [[12, 13, 14], [ 0,  1,  2], [ 9, 10, 11]], [12,  0,  9]

使用相同的种子,它将以相同的方式减少。

修改:我建议您使用np.random.choice(n_total_elem, n_reduce_elem),以确保您只选择一次而不是两次相同的数据