机器学习系列 之 Numpy结构化数据属性和操作(二)
本节内容:
1. 复习上节学到的ndarray数组创建
2. 多维数组矩阵间的运算操作,加,减,乘,与内积 (常用)
3. 矩阵变换操作,转置,求sum, cumsum, diff, 极大,极小值,均值,中位数, 极大值和极小值位置索引,nonzero 非零元素行列坐标分开, sort 矩阵排序
4. 矩阵的拆分与合并。vsplit, hsplit, vstack, hstack
数组的创建
a,b 矩阵输出为了更好展示矩阵间运算的操作,通过np.array( ) 方法直接创建两个相同维度的a,b矩阵,如代码所示:
矩阵运算
需要注意,矩阵间的运算,必须是相同维度,相同行列数的矩阵之间可以进行,加减乘内积等运算操作。比如两行三列,无法同三行两列进行运算,程序会报dimension not match 类似的ERROR
加,减,乘,内积运算 灵活使用运算内积dot 方法,a.dot( b ) 和 np.dot ( a, b ) 二者方法异曲,不同写法,实现一致
矩阵运算非常灵活,可以直接矩阵 a**2, a-1,a+10 来表达整个维度的矩阵 a 内所有元素都 ^2, -1, +10 ,还有开根, e 幂次运算等
参考下方代码举例:
矩阵操作
1. ravel ( ) / flatten ( ) 方法介绍
flatten / ravel将N维矩阵,拉长或者展平成一维数组,但ravel ,flatten 不会改变矩阵的原有shape
参考代码注释:
2. 重新认识reshape( ) 和 shape 属性
reshape VS shapereshape( ) 方法不会改变矩阵的shape 属性,但是shape 属性的重新赋值,会改变原有数据结构的形状。
如下代码显示,D矩阵,原来是2*3 ,reshape为3*2 形状输出显示,但是查看shape 属性,依旧是2*3; 但当把D的shape 赋值成6*1的矩阵的时候,无论矩阵D 的输出还是shape都变成了6行1列。
参考代码注释
3. T 转置
T 转置转置,原来的行变成转置后的列,所以,if 原来两行四列,T后,就是四行两列
转置T,不会改变原来矩阵的形状属性shape
参考代码注释
4. 矩阵合并
hstack VS vstackvstack( val ) VS hstack( val )
vstack 是垂直方向多个矩阵的merge。v 是 vertical 的意思。参数:以元组形式传入多个数组. 如:vstack((a,b,c)) ,vstack要求传入的矩阵维度相同,因为是垂直方向合并数组,所以rows 行数可同可不同,但是列数需要相同。否则,不同列数的矩阵无法上下合并,会有dimension column index 溢出
hstack 是水平方向多个矩阵的合并。h 是 horizontal 的意思。参数:以元组形式传入多个数组. 如:hstack((a,b,c)) ,hstack要求传入的矩阵维度相同,因为是水平方向或者左右相同行数合并数组,所以rows 行数务必相同,columns可同可不同。否则,行数不同,无法在水平方向每行rows做合并。会有dimension rows index 溢出
参考代码注释:
5. 矩阵拆分
hsplit vsplitsplit 加上axis (0,1)专门用于矩阵的横向和纵向拆分,篇幅受限,下节专门介绍
本节,用numpy提供的vsplit( val ) and hsplit ( val )方法来实现矩阵的切分
vsplit 是纵向看矩阵,横向等间距切分。hsplit 是水平方向看过去,等间距切分列数。
注意下,vsplit需要等分,如果实现矩阵的不等量分割,用array_split ( ); 同时vsplit和hsplit也要注意下,行数,列数是否能被等分。五行矩阵是无法被3等分的,如此类似
参考代码注释:
给定范围参数vsplit and hsplit 可以通过传参,指定拆分的范围,参数是元组形式。
例如,原来hsplit(arr,2)// 水平方向的列数一分为二;现在 hsplit(arr, (3,5)) // 水平方向的列数,拆分column 3 和 column 4 这个范围在一起。
参考代码注释
6. 矩阵求和,求极值
sum max / min argmin VS argmaxsum( )求矩阵的所有元素之和, 若分别求行和列,需要加上axis 参数
max( ), min( ) 求矩阵元素极大值,极小值,加上axis求解每行,每列的极值
argmax( ), argmin( ) 求矩阵元素极值的所在位置index,允许带axis参数
参考代码注释
7. 矩阵求均值,求中位数
mean,average,median矩阵的mean 和 average 都是求均值,带上axis则为行or列的均值
方法 median(A) 表示求A矩阵的中位数,奇数序列元素,返回中间值;偶数序列元素,找到中间两个数字,求平均数。
参考代码注释
8. 矩阵求cumsum 累计求和,diff 前后元素之差
cumsum VS diffcumsum 是cumulation sum 累计求和。后一个元素的值,是前面所有元素累计求和后再元素相加的值。
diff 方法是看后一个元素较前一个元素之差是多少
参考代码注释
9. nonzero矩阵非零元素行列坐标分开
nonzerononzero 矩阵中的非零元素值的行坐标index和纵坐标index,拆分成两个数组。而零元素的坐标忽略不计
比如,代码举例中1,2,3...7,8,10,11 都是非零值。他们对应的行坐标分别是
[0, 0, 0, 1, 1, 1, 1, 2, 2, 2]; 纵坐标index是[1, 2, 3, 0, 1, 2, 3, 0, 2, 3]。 也就是二者[0,1] 代表数值1的位置;[0,2]代表数值2的位置,以此类推
参考代码注释
10. sort 矩阵排序,默认横轴axis =1
sortsort 方法,默认是水平方向,矩阵每行元素值的从小到大排序
如果垂直方向,column 排序,需要加上axis =0
参考代码注释
11. clip (arr, small, large) 方法解析
clip方法矩阵arr中的所有元素,找到不在small ~ large 值区间内的元素, 且若比large(最大值还大), 用large value(最大值替换),若比最小值 (small) 还小,则用最小值 (small) 来填充。在small ~ large区间值内的元素不变
参考代码注释
本章小结
1. 矩阵np.array() 的创建使用
2. 矩阵运算
3. 矩阵极值,平均数,中位数,极值index位置等操作
4. 矩阵的vsplit/hsplit 拆分, vstack/hstack 合并