利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(2)
2.3 NumPy数组的运算
数组,不需要编写循环即可对数据执行批量运算!NumPy用户称此特性为矢量化(vectorization)。
(1)大小相等的数组之间的任何算术运算都会将运算应用到元素级
(2)数组与标量的算术运算将标量值传播到各个元素
PS:**在python中表示幂运算,如,2**3表示2的3次方
(3)大小相同的数组之间的比较会生成布尔值数组
(不同大小的数组之间的运算叫广播,本书不需要多广播机制深入理解)
2.4 基本的索引和切片
数组与列表的重要区别在于:数组切片是原始数组的视图,这意味着数据不会被复制,视图上的人任何修改都会直接反映到源数组上。
(1)
(2)标量值和数组都可以被赋值给数组中的元素
(3)
(4)切片索引 - 一维对象,其语法与python的列表差不多
(5)切片索引 - 二维对象,切片是沿着一个轴向选取元素的
arr2d[:2]意为沿着第0轴进行切片,并“选取arr2d的前两行”;
arr2d[:1]意为沿着第0轴进行切片,并“选取arr2d的第一行”;
arr2d[:] 意为沿着第0轴进行切片,并“选取arr2d的全部行”,“只有冒号”表示选取整个轴;
arr2d[:0]会输出该数组的相关属性。
一次传入多个切片
通过整数索引和切片混合,得到低维度的切片
如下,选取第二行的前两列
如下,选取前两行的第3列
如下,“只有冒号”表示选取整个轴
(5)布尔型索引
本例使用一个用于存储数据的数组以及一个存储姓名的数组(含有重复项)
使用numpy.random中的randn函数生成一些正态分布的随即数据:
数组的比较运算(如==)也是矢量化的,故,对names和字符串‘Bob’进行比较运算将会产生一个布尔型数组:
1) 布尔型数组可用于数组索引(布尔型数组的长度必须跟被索引的轴长度一致):
2)布尔型数组跟切片、整数(或整数序列)混合使用:
3)要选择除“Bob”以为的其他值,既可以使用不等号(!=),也可通过(~)对条件进行否定:
4)可组合运用多个布尔条件,使用&(和)、|(或)之类的布尔算术运算符。Python关键字and和or在布尔数组中无效,要使用&和|。
5)通过布尔型数组设置值,是一种常用的手段
(6)花式索引 - 无论数组是多少维的,花式索引总是一维的,且花式索引总视将数据复制到新数组中
花式索引,是一个NumPy术语,指利用整数数组进行索引。
1)为了以特定顺序选取行子集,只需传入一个用于指定顺序的整数列表或ndarray即可:
2)使用负数索引,将会从末尾开始选取行:
3)一次传入多个索引数组,将返回一个一维数组,其中的元素对应各个索引元组
最终选出的元素是(1, 0), (5, 3), (7, 1), (2, 2) . 无论数组是多少维的,花式索引总是一维的
(7)数组转置和轴对换
1)转置 - 在矩阵计算时经常用到,如np.dot计算矩阵内积
转置是重塑的一种特殊形式,返回的是源数据的视图(不会进行任何复制操作)。
转置,在矩阵计算时经常用到,如np.dot计算矩阵内积:
2)高维数组转置,需要用transpose函数,关于transpose的用法理解,有一定难度,但是参考下面的链接后,非常容易理解。https://bbs.pinggu.org/thread-4565507-1-1.html
transpose的元组参数(1, 0, 2)实际代表reshape中的元组参数(2, 2, 4),也即0 > 2,1 > 2,2 > 4
transpose中的元组参数(1, 0, 2)意味着第一个轴换成第二个,第二个轴换成第一个,第三个轴不变。
3)用 .T 对高维数组简单转置,实质就是对轴进行对换
4)用ndarray的swapaxes方法进行转置,该方法需要接受一对轴编号作为参数,并对轴进行调整用于重组数据。swapaxes(p,q)(p和q是轴的编号)表示对换p和q轴,案例中表示对换1-轴和2-轴。