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

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

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

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

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

 

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

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

列举部分一元和二元ufunc

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。示例:

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

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

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

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

(2)数学和统计方法

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

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

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

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

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

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

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

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

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

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

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

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

(4)排序

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

一维数组:

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

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

排序的经典应用:

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

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

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

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

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

NumPy中的集合函数:

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

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

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

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

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

(2)np.savez函数

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

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

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

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

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

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

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

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

4.6 伪随机数生成

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

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

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

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

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

部分numpy.random中的函数:

4.7 示例:随机漫步

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

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

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

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

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

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

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

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

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

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

1)先用any方法进行检查

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值