下面代码inverse(n - 1)前边为什么不能有return?

本篇博客主要记录数据分析中Numpy的相关使用,课件资源来自内蒙古农业大学。所有代码都使用Jupyter Notebook运行,并附上运行结果。

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。


可选参数,通过它可以更改数组的数据类型。
可选参数,表示数组能否被复制,默认是 True。
可选参数,类型为bool值,默认False。为True,使用object的内部数据类型;False:使用object数组的数据类型。







  1. 设置dtype参数,默认自动识别

思考如何将浮点型的数据,设置为整形,会是什么情况?

以上看出a和b的内存地址

以上看出a和b的内存地址
  1. ndmin 用于指定数组的维度


返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。



  1. 设置了起始值、终止值及步长:




在庆祝教师节活动中,学校为了烘托节日气氛,在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。
  • A: 生成数组的起始值为D的A次方
  • B:生成数组的结束值为D的B次方
  • D:指数型数组的底数为D,当省略base=D时,默认底数为10


创建指定大小的数组,数组元素以 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())。

冒号 : 的解释:如果只放置一个参数,

  • 如 [2],将返回与该索引相对应的单个元素。
  • 如果为 [2:],表示从该索引开始以后的所有项都将被提取。
  • 如果使用了两个参数,如 [2:7],那么则提取两个索引(不包括停止索引)之间的项。

从该索引开始以后的所有项都将被提取

从索引开始,到索引结束(不包含结束)


为什么切片和区间会忽略最后一个元素
计算机科学家edsger w.dijkstra(艾兹格·W·迪科斯彻),delattr这一风格的解释应该是比较好的:

  • 当只有最后一个位置信息时,我们可以快速看出切片和区间里有几个元素:range(3)和my_list[:3]
  • 当起始位置信息都可见时,我们可以快速计算出切片和区间的长度,用有一个数减去第一个下标(stop-start)即可
  • 这样做也让我们可以利用任意一个下标把序列分割成不重叠的两部分,只要写成my_list[:x]和my_list[x:]就可以了。

同样适用上述索引提取方法:






注意:切片还可以使用省略号“…”,如果在行位置使用省略号,那么返回值将包含所有行元素,反之,则包含所有列元素。


在 NumPy 中还可以使用高级索引方式,比如整数数组索引、布尔索引,以下将对两种种索引方式做详细介绍。


当输出的结果需要经过布尔运算(如比较运算)时,此时会使用到另一种高级索引方式,即布尔数组索引。下面示例返回数组中大于 6 的的所有元素:


  • 布尔索引 实现的是通过一维数组中的每个元素的布尔型数值对一个与一维数组有着同样行数或列数的矩阵进行符合匹配。
    这种作用,其实是把一维数组中布尔值为True的相应行或列给抽取了出来

(注意:一维数组的长度必须和想要切片的维度或轴的长度一致)。

True和False的形式表示需要和不需要的数据




那么是否可以用两个一维布尔数组进行切片呢?我们继续进行试验得到如下结果:

从结果上看,它实际上等价于下面的代码。

NumPy 能方便地求出统计学常见的描述性统计量。

是按顺序排列的一组数据中居于中间位置的数,代表一个样本、种群或概率分布中的一个数值

  • 平均数:是一个"虚拟"的数,是通过计算得到的,它不是数据中的原始数据。. 中位数:是一个不完全"虚拟"的数。
  • 平均数:反映了一组数据的平均大小,常用来一代表数据的总体 “平均水平”。. 中位数:像一条分界线,将数据分成前半部分和后半部分,因此用来代表一组数据的"中等水平"

若想求某一维度的平均值,设置 axis 参数,多维数组的元素指定


在概率统计中最常使用作为统计分布程度上的测量,是反映一组数据离散程度最常用的一种量化形式,是表示精确度的重要指标

  • 标准差定义是总体各单位标准值与其平均数离差平方的算术平均数的平方根。

简单来说,标准差是一组数据平均值分散程度的一种度量。

  • 一个较大的标准差,代表大部分数值和其平均值之间差异较大;
  • 一个较小的标准差,代表这些数值较接近平均值。
例如,A、B两组各有6位学生参加同一次语文测验, 分析那组学生之间的差距大?

标准差应用于投资上,可作为量度回报稳定性的指标。标准差数值越大,代表回报远离过去平均数值,回报较不稳定故风险越高。相反,标准差数值越小,代表回报较为稳定,风险亦较小。

衡量随机变量或一组数据时离散程度的度量

即将各数值乘以相应的权数,然后加总求和得到总体值,再除以总的单位数

  • 与 a 中的值关联的权重数组。 a 中的每个值都根据其关联的权重对平均值做出贡献。权重数组可以是一维的(在这种情况下,它的长度必须是沿给定轴的 a 的大小)或与 a 具有相同的形状。如果 weights=None,则假定 a 中的所有数据的权重等于 1。一维计算是:

使用“示例—权重已知”中的数据,我们对比两位学生的考试成绩

学校规定的学科综合成绩的计算方式是:

要求 :比较谁的综合成绩更好

小明的综合成绩: 90.5
小刚的综合成绩: 86.0

NumPy中也有自己的随机函数,包含在random模块中。它能产生特定分布的随机数,如正态分布等。接下来介绍一些常用的随机数。

生成(0,1)均匀分布随机数
生成标准正态分布随机数
  • rand函数根据给定维度生成[0,1)之间的数据,包含0,不包含1
  • 返回值为指定维度的array


  • randn函数返回一个或一组样本,具有标准正态分布。
  • 返回值为指定维度的array

标准正态分布又称为u分布,是以0为均值、以1为标准差的正态分布,记为N(0,1)。

  • 返回随机整数,范围区间为[low,high),包含low,不包含high
  • 参数:low为最小值,high为最大值,size为数组维度大小,dtype为数据类型,默认的数据类型是np.int
  • high没有填写时,默认生成随机数的范围是[0,low)



使用相同的seed()值,则每次生成的随机数都相同,使得随机数可以预测

但是,只在调用的时候seed()一下并不能使生成的随机数相同,需要每次调用都seed()一下,表示种子相同,从而生成的随机数相同。

作用:返回一个由size指定形状的数组,数组中的值服从 μ=loc,σ=scale 的正态分布。

  • size : int型或者int型的元组,指定了数组的形状。如果不提供size,且loc和scale为标量(不是类数组对象),则返回一个服从该分布的随机数。

返回指定形状的新数组。
将元素值添加到数组的末尾。
沿规定的轴将元素值插入到指定的元素前。
删掉某个轴上的子数组,并返回删除后的新数组。
返回数组内符合条件的元素的索引值。
用于删除数组中重复的元素,并按元素值由大到小返回一个新数组。
对输入数组执行排序,并返回一个数组副本
沿着指定的轴,对输入数组的元素值进行排序,并返回排序后的元素索引数组

在数组的末尾添加值,默认返回一个一维数组。

  • values:向 arr 数组中添加的值,需要和 arr 数组的形状保持一致;
  • axis:默认为 None,返回的是一维数组;当 axis =0 时,追加的值会被添加到行,而列数保持不变,若 axis=1 则与其恰好相反。

表示沿指定的轴,在给定索引值的前一个位置插入相应的值,如果没有提供轴,则输入数组被展开为一维数组。

  • obj:表示索引值,在该索引值之前插入 values 值;
  • values:要插入的值;
  • axis:指定的轴,如果未提供,则输入数组会被展开为一维数组。


该方法表示从输入数组中删除指定的子数组,并返回一个新数组。它与 insert() 函数相似,若不提供 axis 参数,则输入数组被展开为一维数组。

  • arr:要输入的数组;
  • obj:整数或者整数数组,表示要被删除数组元素或者子数组;
  • axis:沿着哪条轴删除子数组。

该函数返回数组中非 0 元素的索引,若是多维数组则返回行、列索引组成的索引坐标。

  • arr:输入数组,若是多维数组则以一维数组形式展开;
  • return_index:如果为 True,则返回新数组元素在原数组中的位置(索引);
  • return_inverse:如果为 True,则返回原数组元素在新数组中的位置(索引);
  • return_counts:如果为 True,则返回去重后的数组元素在原数组中出现的次数。
  • axis:沿着指定轴进行排序,如果没有指定 axis,默认在最后一个轴上排序(行),若 axis=0 表示按列排序,axis=1 表示按行排序;
  • order:若数组设置了字段,则 order 表示要排序的字段。


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。那么我们需要利用连续的6s[i]构造出至少两个模n同余0的整数,然后对其求最大公因数,便可以得到n进而得到a,b,c

gcd(t1-t2,t3-t4)可以的kn,幸运的是题目中的数据求出的k恰好为1。恢复得到n后,可以利用z1的等式求a,同样的可以求得c(需要注意的是不能直接用z1

由于target过大,我们无法通过递推式直接求解,笔者这里使用了coin师傅的做法,即使用矩阵快速幂快速求解s[target]

由于是递推的形式,于是有

也就是说,我们只需要将系数矩阵进行k次运算便可以得到最终结果的系数矩阵,然后与原始矩阵相乘便可以得到s[target]

# 原始矩阵,这里笔者将初始的s[0],s[1] 恢复了出来 # 目标的系数矩阵 可以通过矩阵快速求解

这道题是源自nsucrypto 2020上的一道改编题,有兴趣的读者可以自行google。题面如下:

我们发现n是三素数组合的模数,其中素数r已经给出,于是可以将题目化简为:

于是有向量(a1,a2)在如下的格中

通过格基规约,可以得到较小的向量(a1,a2)

且k的范围比较小,这里没有具体推出,大概-20 ~ 20 就够了

n由三个素数构成,其中r已经给出,于是又

求得x == p+q后解二次方程得到p,q最终可以得到结果。

我要回帖

更多关于 n皇后问题c语言代码 的文章

 

随机推荐