问题背景:
在学习机器学习算法KNN近邻算法时遇到的一个关于bumpy数组使用的问提
问题描述
创建一个数据集,用二维列表分别创建样本的特征和类别。再将创建好的列表数据转numpy的数组。
(这里为什么要将列表转化为numpy数组呢?可以看一些这篇文章numpy数组和列表的区别https://blog.csdn.net/Star_SDK/article/details/80600673
plt.scatter(x_train[y_train0,0],x_train[y_train0,1],color=‘g’)
plt.scatter(x_train[y_train1,0],x_train[y_train1,1],color=‘r’),
这两行代码的作用是筛选出种类是指定类别那一行的第0/1列,比如x_trian[y_train==0,0] ,这行的含义是筛选出种类是0的那一行的第0列,比如:3.39,3.11,1.34,3.58,2.28(为什么是五个呢,因raw_data_y = [0,0,0,0,0,1,1,1,1,1]前五个是0,所以对应个)
疑问在于为什么y_trian 能与x_trian联合使用呢??????
raw_data_x = [[3.39,2.33], [3.11,1.78],
[1.34,3.36], [3.58,4.67],
[2.28,2.86], [7.42,4.69],
[5.74,3.53], [9.17,2.51],
[7.79,3.42],[7.93,0.79]]
raw_data_y = [0,0,0,0,0,1,1,1,1,1]
x_train = np.array(raw_data_x)
y_train = np.array(raw_data_y)
plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color='g')
plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color='r')
plt.show()
原因分析:
X是一个数组,数组的元素是一个二元组。在解释x_train[y_train==0, 0]之前,首先要明白x_train[:,:]左面:代表的是行范围,右边“:”代表的是列范围,如果是冒号则代表全部。那么无论是“:”,还是指定一个范围(类似于(2,3)),其实本质都是会被翻译成一个true/false的一维一元数组,每个元素都是代表数组对应位置的元素是否要出现。
比如,y_train=([0,0,0,0,0,1,1,1,1,1])表面前5个样本属于0这个类别那么
x_train[y_train0, 0],就表示x_train的哪一行返回即[ture(返回),ture(返回),ture(返回),ture(返回),ture(返回),false(不返回)…],前五行返回,后五行不返回。
x_train[y_train0,0]中的第二个0的意识是返回这一行那一列,x_train[y_train0,0]表示返回类别是0的所有行的第一列
x_train[y_train0,1]表示返回类别是0的所有行的第二列
x_train[y_train1,0]表示返回类别是1的所有行的第一列
x_train[y_train1,0]表示返回类别是1的所有行的第二列
这里看到在python里面行列的处理模式是不一样的,行的取舍是通过一个True/ False数组来实现的,列的取舍确实通过指定了那一列;这个其实从矩阵的角度能够更好的理解。