机器学习系列 之 Numpy结构化数据属性和操作(二)

2020-05-01  本文已影响0人  佳佳爱科技AITech

本节内容:

1. 复习上节学到的ndarray数组创建

2. 多维数组矩阵间的运算操作,加,减,乘,与内积 (常用)

3. 矩阵变换操作,转置,求sum, cumsum, diff, 极大,极小值,均值,中位数, 极大值和极小值位置索引,nonzero 非零元素行列坐标分开, sort 矩阵排序

4. 矩阵的拆分与合并。vsplit, hsplit, vstack, hstack

数组的创建 

为了更好展示矩阵间运算的操作,通过np.array( ) 方法直接创建两个相同维度的a,b矩阵,如代码所示:

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 ( ) 方法介绍

将N维矩阵,拉长或者展平成一维数组,但ravel ,flatten 不会改变矩阵的原有shape

参考代码注释:

flatten / ravel

2. 重新认识reshape( ) 和 shape 属性

reshape( ) 方法不会改变矩阵的shape 属性,但是shape 属性的重新赋值,会改变原有数据结构的形状。

如下代码显示,D矩阵,原来是2*3 ,reshape为3*2 形状输出显示,但是查看shape 属性,依旧是2*3; 但当把D的shape 赋值成6*1的矩阵的时候,无论矩阵D 的输出还是shape都变成了6行1列。

参考代码注释

reshape VS shape

3. T 转置

转置,原来的行变成转置后的列,所以,if 原来两行四列,T后,就是四行两列

转置T,不会改变原来矩阵的形状属性shape

参考代码注释

T 转置

4. 矩阵合并

vstack( 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 溢出

参考代码注释:

hstack VS vstack

5. 矩阵拆分

split 加上axis (0,1)专门用于矩阵的横向和纵向拆分,篇幅受限,下节专门介绍

本节,用numpy提供的vsplit( val ) and hsplit ( val )方法来实现矩阵的切分

vsplit 是纵向看矩阵,横向等间距切分。hsplit 是水平方向看过去,等间距切分列数。

注意下,vsplit需要等分,如果实现矩阵的不等量分割,用array_split ( ); 同时vsplit和hsplit也要注意下,行数,列数是否能被等分。五行矩阵是无法被3等分的,如此类似

参考代码注释:

hsplit vsplit

vsplit and hsplit 可以通过传参,指定拆分的范围,参数是元组形式。

例如,原来hsplit(arr,2)// 水平方向的列数一分为二;现在 hsplit(arr, (3,5)) // 水平方向的列数,拆分column 3 和 column 4 这个范围在一起。

参考代码注释

给定范围参数

6. 矩阵求和,求极值

sum( )求矩阵的所有元素之和, 若分别求行和列,需要加上axis 参数

max( ), min( ) 求矩阵元素极大值,极小值,加上axis求解每行,每列的极值

argmax( ), argmin( ) 求矩阵元素极值的所在位置index,允许带axis参数

参考代码注释

sum max / min argmin VS argmax

7. 矩阵求均值,求中位数

矩阵的mean 和 average 都是求均值,带上axis则为行or列的均值

方法 median(A) 表示求A矩阵的中位数,奇数序列元素,返回中间值;偶数序列元素,找到中间两个数字,求平均数。

参考代码注释

mean,average,median

8. 矩阵求cumsum 累计求和,diff 前后元素之差

cumsum 是cumulation sum 累计求和。后一个元素的值,是前面所有元素累计求和后再元素相加的值。

diff 方法是看后一个元素较前一个元素之差是多少

参考代码注释

cumsum VS diff

9. nonzero矩阵非零元素行列坐标分开

nonzero 矩阵中的非零元素值的行坐标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的位置,以此类推

参考代码注释

nonzero

10. sort 矩阵排序,默认横轴axis =1

sort 方法,默认是水平方向,矩阵每行元素值的从小到大排序

如果垂直方向,column 排序,需要加上axis =0 

参考代码注释

sort

11. clip (arr, small, large) 方法解析

矩阵arr中的所有元素,找到不在small ~ large 值区间内的元素, 且若比large(最大值还大), 用large value(最大值替换),若比最小值 (small) 还小,则用最小值 (small) 来填充。在small ~ large区间值内的元素不变

参考代码注释

clip方法

本章小结

1. 矩阵np.array() 的创建使用

2. 矩阵运算

3. 矩阵极值,平均数,中位数,极值index位置等操作

4. 矩阵的vsplit/hsplit 拆分, vstack/hstack 合并

上一篇下一篇

猜你喜欢

热点阅读