本篇博客主要记录数据分析中Numpy的相关使用,课件资源来自内蒙古农业大学。所有代码都使用Jupyter Notebook运行,并附上运行结果。
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
可选参数,通过它可以更改数组的数据类型。 |
可选参数,表示数组能否被复制,默认是 True。 |
可选参数,类型为bool值,默认False。为True,使用object的内部数据类型;False:使用object数组的数据类型。 |
以上看出a和b的内存地址思考如何将浮点型的数据,设置为整形,会是什么情况?
以上看出a和b的内存地址
返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。 |
在庆祝教师节活动中,学校为了烘托节日气氛,在200米长的校园主干道一侧,
从起点开始,每间隔3米插一面彩旗,由近到远排成一排,
问:1.最后一面彩旗会插到终点处吗?
2.一共应插多少面彩旗?
想得到一个长度为3的、从0.1开始的、间隔为0.1的数组,想当然地如下coding,结果意料之外:
返回在间隔[开始,停止]上计算的num个均匀间隔的样本。数组是一个等差数列构成
必填项,序列的起始值, |
必填项,序列的终止值,如果endpoint为true,该值包含于数列中 |
要生成的等步长的样本数量,默认为50 |
该值为 true 时,数列中包含stop值,反之不包含,默认是True。 |
如果为 True 时,生成的数组中会显示间距,反之不显示。 |
#想得到一个长度为10的、从0.1开始的、间隔为0.1的数组
等差数列 在线性回归经常作为样本集
如:生成x_data,值为[0, 100]之间500个等差数列数据集合作为样本特征,根据目标线性方程y=3*x+2,生成相应的标签集合y_data
返回在间隔[开始,停止]上计算的num个均匀间隔的样本。数组是一个等比数列构成
必填项,序列的起始值, |
必填项,序列的终止值,如果endpoint为true,该值包含于数列中 |
要生成的等步长的样本数量,默认为50 |
该值为 true 时,数列中包含stop值,反之不包含,默认是True。 |
创建指定大小的数组,数组元素以 0 来填充
秩,即轴的数量或维度的数量 |
数组的维度,对于矩阵,n 行 m 列 |
数组元素的总个数,相当于 .shape 中 n*m 的值 |
ndarray 对象中每个元素的大小,以字节为单位 |
返回一个包含数组维度的元组,对于矩阵,n 行 m 列,它也可以用于调整数组维度
返回调整维度后的副本,而不改变原 ndarray。
返回数组的维度(秩):轴的数量,或者维度的数量,是一个标量,一维数组的秩为 1,二维数组的秩为 2
数组元素的总个数,相当于 .shape 中 n*m 的值
numpy数据类型转换,调用astype返回数据类型修改后的数据,但是源数据的类型不会变
修改类型后再次操作,类型改变: float32以字节的形式返回数组中每一个元素的大小。
半精度浮点数:1 个符号位,5 个指数位,10个尾数位 单精度浮点数:1 个符号位,8 个指数位,23个尾数位 双精度浮点数,包括:1 个符号位,11 个指数位,52个尾数位 |
|
复数,表示双 32 位浮点数(实数部分和虚数部分) 复数,表示双 64 位浮点数(实数部分和虚数部分) |
|
代表与1字节相同的8位整数 代表与2字节相同的16位整数 代表与4字节相同的32位整数 代表与8字节相同的64位整数 |
|
代表1字节(8位)无符号整数 代表与2字节相同的16位整数 代表与4字节相同的32位整数 代表与8字节相同的64位整数 |
表示字节串类型,也就是bytes类型 |
在内存里统一使用unicode, 记录到硬盘或者编辑文本的时候都转换成了utf8
UTF-8 将Unicode编码后的字符串保存到硬盘的一种压缩编码方式
字节串(S)与字符串(a) |
还可以将两个字符作为参数传给数据类型的构造函数。此时,第一个字符表示数据类型,
第二个字符表示该类型在内存中占用的字节数(2、4、8分别代表精度为16、32、64位的
以下示例描述一位老师的姓名、年龄、工资的特征,该结构化数据其包含以下字段:
ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。
区别在于:数组切片是原始数组视图(这就意味着,如果做任何修改,原始都会跟着更改)。
这也意味着,如果不想更改原始数组,我们需要进行显式的复制,从而得到它的副本(.copy())。
冒号 : 的解释:如果只放置一个参数,
从该索引开始以后的所有项都将被提取
从索引开始,到索引结束(不包含结束)
为什么切片和区间会忽略最后一个元素
计算机科学家edsger w.dijkstra(艾兹格·W·迪科斯彻),delattr这一风格的解释应该是比较好的:
同样适用上述索引提取方法:
注意:切片还可以使用省略号“…”,如果在行位置使用省略号,那么返回值将包含所有行元素,反之,则包含所有列元素。
在 NumPy 中还可以使用高级索引方式,比如整数数组索引、布尔索引,以下将对两种种索引方式做详细介绍。
当输出的结果需要经过布尔运算(如比较运算)时,此时会使用到另一种高级索引方式,即布尔数组索引。下面示例返回数组中大于 6 的的所有元素:
(注意:一维数组的长度必须和想要切片的维度或轴的长度一致)。
那么是否可以用两个一维布尔数组进行切片呢?我们继续进行试验得到如下结果:
从结果上看,它实际上等价于下面的代码。
NumPy 能方便地求出统计学常见的描述性统计量。
是按顺序排列的一组数据中居于中间位置的数,代表一个样本、种群或概率分布中的一个数值
若想求某一维度的平均值,设置 axis 参数,多维数组的元素指定
在概率统计中最常使用作为统计分布程度上的测量,是反映一组数据离散程度最常用的一种量化形式,是表示精确度的重要指标
简单来说,标准差是一组数据平均值分散程度的一种度量。
标准差应用于投资上,可作为量度回报稳定性的指标。标准差数值越大,代表回报远离过去平均数值,回报较不稳定故风险越高。相反,标准差数值越小,代表回报较为稳定,风险亦较小。
衡量随机变量或一组数据时离散程度的度量
即将各数值乘以相应的权数,然后加总求和得到总体值,再除以总的单位数
与 a 中的值关联的权重数组。 a 中的每个值都根据其关联的权重对平均值做出贡献。权重数组可以是一维的(在这种情况下,它的长度必须是沿给定轴的 a 的大小)或与 a 具有相同的形状。如果 weights=None,则假定 a 中的所有数据的权重等于 1。一维计算是:
使用“示例—权重已知”中的数据,我们对比两位学生的考试成绩
学校规定的学科综合成绩的计算方式是:
要求 :比较谁的综合成绩更好
小明的综合成绩: 90.5
小刚的综合成绩: 86.0
NumPy中也有自己的随机函数,包含在random模块中。它能产生特定分布的随机数,如正态分布等。接下来介绍一些常用的随机数。
生成(0,1)均匀分布随机数 |
生成标准正态分布随机数 |
标准正态分布又称为u分布,是以0为均值、以1为标准差的正态分布,记为N(0,1)。
使用相同的seed()值,则每次生成的随机数都相同,使得随机数可以预测
但是,只在调用的时候seed()一下并不能使生成的随机数相同,需要每次调用都seed()一下,表示种子相同,从而生成的随机数相同。
作用:返回一个由size指定形状的数组,数组中的值服从 μ=loc,σ=scale 的正态分布。
返回指定形状的新数组。 |
将元素值添加到数组的末尾。 |
沿规定的轴将元素值插入到指定的元素前。 |
删掉某个轴上的子数组,并返回删除后的新数组。 |
返回数组内符合条件的元素的索引值。 |
用于删除数组中重复的元素,并按元素值由大到小返回一个新数组。 |
对输入数组执行排序,并返回一个数组副本 |
沿着指定的轴,对输入数组的元素值进行排序,并返回排序后的元素索引数组 |
在数组的末尾添加值,默认返回一个一维数组。
表示沿指定的轴,在给定索引值的前一个位置插入相应的值,如果没有提供轴,则输入数组被展开为一维数组。
该方法表示从输入数组中删除指定的子数组,并返回一个新数组。它与 insert() 函数相似,若不提供 axis 参数,则输入数组被展开为一维数组。
该函数返回数组中非 0 元素的索引,若是多维数组则返回行、列索引组成的索引坐标。
argsort() 沿着指定的轴,对输入数组的元素值进行排序,并返回排序后的元素索引数组。示例如下:
由于比赛的时间和上课的时间冲突了,只抽空做了一下crypto3。赛后有把没有做的题做了一下,不得不说安恒月赛的水平越来越高,比某guo赛强很多(吹一波师傅们)。
由于a和b过小
,如果对n
直接开四次方根,可以得到n^(1/4) == x*y
,验证代码如下:
n开二次方根,最终脚本如下:
个人认为本次比赛最难的一题,题面如下:
这道题有两个考点,第一个考点就是如何恢复参数a,b,c,n
,第二个难点是target
过大,如果使用题目种的方法计算会爆内存。
熟悉LCG
的选手应该对此类参数恢复认识比较深刻,不过次题稍微有所变化。我们发现s[i] = a*s[i-2]+b*s[i-1]+c mod n
有四个未知参数,且每一项与其前两项相关。如果我们将n
恢复出来,剩下的问题就迎刃而解了。那么如何恢复n
呢??考虑两个同余式,t1 =
或者
k*n,对于k*n
我们只需要分解它即可得到n
。那么我们需要利用连续的6
个s[i]
构造出至少两个模n
同余0
的整数,然后对其求最大公因数,便可以得到n
进而得到a,b,c
求gcd(t1-t2,t3-t4)
可以的kn
,幸运的是题目中的数据求出的k
恰好为1
。恢复得到n
后,可以利用z1
的等式求a
,同样的可以求得c
(需要注意的是不能直接用z1
过大,我们无法通过递推式直接求解,笔者这里使用了coin师傅的做法,即使用矩阵快速幂快速求解由于
targets[target]
由于是递推的形式,于是有
也就是说,我们只需要将系数矩阵进行k
次运算便可以得到最终结果的系数矩阵,然后与原始矩阵相乘便可以得到s[target]
这道题是源自nsucrypto 2020
上的一道改编题,有兴趣的读者可以自行google。题面如下:
我们发现n
是三素数组合的模数,其中素数r
已经给出,于是可以将题目化简为:
于是有向量(a1,a2)
在如下的格中
通过格基规约,可以得到较小的向量(a1,a2)
且k的范围比较小,这里没有具体推出,大概-20 ~ 20 就够了
n
由三个素数构成,其中r已经给出,于是又
求得x == p+q
后解二次方程得到p,q
最终可以得到结果。