2016-07-25 69 views
5

我正在机器学习课程,并有一个建议(约制作类平衡)使用以下字符串:怎么可能用这种方式来分片?

X_train_to_add = X_train[y_train.as_matrix() == 1, :][indices_to_add, :] 

其中y_train是大熊猫数据框(其转化那里的numpy array via as.matrix())。我不明白如何使用矩阵作为切片的索引。

+2

这就是所谓的[布尔索引](http://docs.scipy.org/doc/numpy/user/basics.indexing.html#boolean-or-mask-index-arrays)。 – ayhan

+0

从SO文档:http://stackoverflow.com/documentation/numpy/1296/the-basics/6738/boolean-indexing#t=201607250121018073291 – ayhan

+0

这不是*字符串*。这是*代码*,或者你指的是*语法*。一个字符串是一种类似于“”的数据,这里是一些文本“。在询问编程时,不要与其他含义一起使用。 – Bakuriu

回答

0

这可能有助于将声明分解为其组成部分。本声明相当于以下语句顺序:

y = y_train.as_matrix() 
row_mask = y == 1 
X_masked = X_train[row_mask,:] 
X_train_to_add = X_masked[indices_to_add, :] 

让我们看一个具体的例子。让我们假设yX_train,并且indices_to_add具有以下值:

>>> import numpy as np 
>>> y = np.array([1, 2, -1, 1, 1]) 
>>> X_train = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]]) 
>>> indices_to_add = np.array([2, 0]) 

首先,我们创建一个布尔数组,指明其y元素等于1,我们将称之为“行面具”。

>>> row_mask = y == 1 
>>> row_mask 
array([ True, False, False, True, True], dtype=bool) 

接下来,我们使用行掩模选择的行X_train使得row_mask的相应值是True(或等价地,行使得y的对应值等于1)。

>>> X_masked = X_train[row_mask,:] 
>>> X_masked 
array([[ 1, 2, 3], 
     [10, 11, 12], 
     [13, 14, 15]]) 

最后,我们使用一个索引数组来选择前一个结果中的某些行。请注意,这些索引是指X_masked的行,而不是原始矩阵X_train

>>> X_train_to_add = X_masked[indices_to_add,:] 
>>> X_train_to_add 
array([[13, 14, 15], 
     [ 1, 2, 3]]) 

你可以看到在documentation numpy的索引的一些例子。