利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

时间:2023-03-09 12:48:20
利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

4.2 通用函数:快速的元素级数组函数

通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数。

1)一元(unary)ufunc,如,sqrt和exp函数

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

2)二元(unary)ufunc,可接受2个数组,并返回一个结果数组,如add或maximum函数

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3) 利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

3)部分ufunc可返回多个数组,如modf,是Python内置函数divmod的矢量化版本,可返回浮点数数组的整数部分和小数部分:

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

4)Ufuncs可以接受一个out可选参数,这样就能在数组原地进行操作。

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

列举部分一元和二元ufunc

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

 4.3 利用数组进行数据处理

numpy提供的numpy.meshgrid()函数可以让我们快速生成坐标矩阵X,Y。

语法:X,Y = numpy.meshgrid(x, y)
输入的x,y,就是网格点的横纵坐标列向量(非矩阵)
输出的X,Y,就是坐标矩阵。

(1)将条件逻辑表述为数组运算 - Numpy.where函数

numpy.where函数是三元表达式 x if condition else y 的矢量化版本。numpy.where(condition, result1, reult2),如果condition为真值,则输出result1,如果condition为False值,则输出result2。示例:

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

假设我们有如上一个布尔数组和两个值数组,现根据cond中的值选取xarr和yarr值,也即:当cond中为True时,选取xarr的值,否则从yarr中选取。

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

Ps:在数据分析工作中,where通常用于根据一个数组生成一个新数组。

如,希望将一个由随机数据组成的矩阵中,所有的正值替换为2,所有负值替换为-2,则实现如下:

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

此外,np.where 可以将标量和数组结合使用,如仅将arr中的正值替换为2,其余保持不变:

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

(2)数学和统计方法 

可通过数组上的一组数学函数,对整个数组或某个轴向的数据进行统计计算。sum、mean及标准差std等聚合计算(aggreation,通常叫约简-reduction)既可当作数组的实例方法调用,也可以当作*NumPy函数使用。

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

Ps:mean和sum这类函数可接受一个axis选项参数,用于计算该轴向上的统计值,最终结果是一个少一维的数组。

关于NumPy数组轴的理解,参见:https://www.cnblogs.com/ElonJiang/p/11626851.html

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

arr.mean(axis = 1) 是指沿列方向折叠聚合求每一行的平均值;

arr.sum(axis = 0) 是指沿行方向折叠聚合求每一列的和。

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

arr.cumsum和arr.cumprod分别用于求所有元素的累计和,以及累计积。同样适用于多维数组:

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

列出全部的基本数组统计方法:

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

(3)用于布尔型数组的方法

1)布尔型数组中的sum方法

在上面(2)所列出的方法中,布尔值会被强制转换为1(True)和0(False),故,sum经常被用来对布尔型数组中的True值计数:

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

2)布尔型数组中的any和all方法

any用于测试数组中是否存在一个或多个True;all用于检查数组中所有值是否都是True

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

Ps:any和all方法也可用于非布尔类型数组,所有非0元素将会被当作True。

(4)排序

NumPy数组,跟Python内置的列表类型一样,可以通过sort方法就地排序。

一维数组:

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

多维数组(可在任何一个轴向进行排序,只需将轴编号传给sort即可):

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

Ps:*方法 np.sort()返回的是数组的已排序副本,但前述arr.sort()是就地排序会修改数组本身。

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

排序的经典应用:

计算数组分位数,最简单方法是对数组进行排序,然后取特定位置的值即可,示例如下。

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

(5)唯一化及其他的集合逻辑

NumPy提供了一些针对一维ndarray的基本集合运算

1)np.unique,最常用的基本集合运算方法,用于找出数组中的唯一值并返回已排序的结果。

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

2)np.in1d,用于测试一个数组中的值在另一个数组中的成员资格,返回一个布尔型数组。

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

NumPy中的集合函数:

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

4.4 用于数组的文件输入输出

NumPy能够读写磁盘上的文本数据或二进制数据,此处仅学习NumPy的内置二进制格式(通常更多用户会使用pandas或其他加载文本或表格数据,见第6章)

(1)np.save和np.load函数

np.save函数,用于在磁盘上写入数组数据,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npy的文件中。

np.load函数,用于从磁盘上读取数组数据。

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

(2)np.savez函数

np.savez函数,可将多个数组保存到一个未压缩的文件中,将数组以关键字参数的形式传入即可。

加载 .npz文件时,会得到一个类似字典的对象,该对象会对各个数组进行延迟加载。

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

4.5  线性代数(不完整,待需要之时深入学习)

线性代数,如矩阵乘法、矩阵分解、行列式以及其他方阵数学等,是任何数组库的重要组成部分。

(1)矩阵乘法numpy.dot函数,既是一个数组方法,也是numpy命名空间中的一个函数

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

x.dot(y) 等价于 np.dot(x, y)

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

numpy.linalg中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的函数,常用的numpy.linalg列出如下:

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

该部分涉及较多线性代数的数学知识,故其余的在业务需要之时,结合案例学习。

4.6 伪随机数生成

numpy.random模块对Python内置的random进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数。

称之为“伪随机函数”,是因为它们都是通过 算法基于 随机数生成器种子,在确定性的条件下生成的。

可通过NumPy的np.random.seed更改随机数生成种子:

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

numpy.random的数据生成函数,使用了全局的随机种子。

要避免全局状态,可使用np.random.RandomState创建一个与其它隔离的随机数生成器:

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

部分numpy.random中的函数:

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

4.7 示例:随机漫步

随机漫步理论参考:https://blog.****.net/Da___Vinci/article/details/82958297

(1)简单的随机漫步:从0开始,步长1和-1等概率出现

关于random.randint函数,参见:https://www.cnblogs.com/ElonJiang/p/11627717.html

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

基于所得的数据,沿漫步路径做一些统计工作,如求最大值和最小值:

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

继续求1000个随机漫步值生成的折线图:

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

Ps:稍复杂的统计任务——计算首次穿越时间,即随机漫步过程中第一次到达某个特定值的时间

假设,统计本次随机漫步需要多久才能距离初始0点至少10步远(任一方向均可)

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

其中,函数 .argmax(),返回的是该布尔型数组(np.abs(walk)>=10)第一个最大值的索引(True就是最大值)。

(2)一次模拟多个随机漫步

示例,模拟5000个随机漫步过程。

(关于np.random.randint函数,参见:https://www.cnblogs.com/ElonJiang/p/11627717.html

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

进行随机漫步过程最大值和最小值的统计:

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

统计30或-30的最小穿越时间:

1)先用any方法进行检查

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

2)用该布尔类型数组选出穿越了30(abs绝对值)的随机漫步(行),调用argmax在轴1上获取穿越时间

利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)