Numpy基础知识小记
Numpy的array以及创建方法和操作函数
array对象的背景
- Numpy的核心数据结构,也叫做array就是数组,array对象可以是一维数组,也可以是多维数组;
- Python的List也可以实现相同的功能,但是array比List的性能更好,包含大量的便捷函数;
- Numpy成为事实上的Scipy、Pandas、Scikit-Learn、Tensorflow、PaddlePaddle等框架的“通用底层语言”
- Numpy的array和Python的List的一个区别是,它的元素必须是同一种数据类型,比如都是int类型,这也是Numpy高性能的一个原因
array本身的属性
- shape:返回一个元组(const的list),表示array的维度
- ndim:一个数组,表示array的维度的数目
- size:一个数字,表示array中所有数据元素的数目
- dtype:array中元素的数据类型
创建array的方法
- 从Python的列表List和嵌套列表创建array
- 使用预定函数arange、ones/ones_like、zeros/zeros_like、empty/empty_like、full/full_like、eye等函数创建
- 生成随机数的np.random模块构建
array本身支持的大量操作和函数
- 直接主元素加减乘除等算术操作(python原生代码中是一个一个开平方开立方计算,但是numpy可以对整个数组直接进行计算,就相当于把数组压缩成了一个元素!!)
- 更好用的面向多维的数组索引
- 求sum/mean等聚合函数
- 线性代数函数,比如求解逆矩阵、求解方程组
创建array的便捷函数
使用arange创建数字序列
和python中的range一样:
使用ones创建全是1的数组
使用ones_like创建形状相同的数组
zeros和zeros_like同理
empty和empty_like类似,填的全是随机数而非0
fill和fill_like也是,填的是自己想要的值
使用random模块生成随机数的数组
array本身支持大量操作和函数
这些操作如果用python实现需要写很多for循环,用numpy数组很容易
最大的特点:array对象,以数组为单位进行运算,不需要for循环!!
Numpy怎样对数组使用索引查询
基础索引
一维数组
索引和python的List一样
二维数组
不太一样嗷,List中是跟C语言的数组一样的,例如x[i][j]
然鹅,array中是x[i,j]
中间是用逗号隔开的!!
神奇索引(对比基础索引,他多了个中括号,因为它是对好多的行和列,而基础索引只是某一行/连着的某几行(切片))
一维数组
argsort
传回来的是下标,然后根据神奇索引访问
感觉就是根据index代入啊!!!索引到value然后代入index的输入形式!!
二维数组
- 规律:
数组之间有逗号,逗号之前是一个数组,代表要取的行号,逗号后面是也一个数组,代表要取得列号!!!
原则仍然是根据索引代换进去!!!
布尔索引
一维数组
bool类型就是true或者false哇,就是一种阈值的方法
二维数组
意思是,输出【第三列】元素值【大于5】的那些行
bool的二维数组只有True和False的时候,再以它作为参数,取到的索引是一维的!!!
条件的组合
Numpy常用random随机函数汇总
rand函数,参数表示维度(0到1)
randn函数,范围不一定在0到1之间,而是呈正态分布
randint函数,生成某一个范围内的整数随机数
random函数(0到1)(只有一个size)(和最上面额rand函数没啥区别啊???参数都是维数!!)
choice函数(顾名思义,就是选择嘛)
最外层逗号把参数分成前后两块,前面一部分是【给你选的东西】(如果【给你选的东西】是一个数字n,则表示range(n),如果是一个List,则表示在这个里面挑选),后面一部分是size,确定了维度!!
shuffle()函数,打乱顺序!!(修改原数组,无返回值!!)
遇到多维数组,只会对第一维度进行打乱!!!
意思就是这样的效果:
即进行行打乱,但是后面还是跟着第一位(老大)的!!!同一行一直是同一行,只是行与行之间打乱
permutation(x)函数(也是打乱,但是与shuffle不同)
把一个数组x进行随机排列,或者数字的全排列
这与shuffle类似,一个数的时候表示range(n),多个数则表示多维度
但是!!!!shuffle是浅拷贝,即改变了原数组;而permutation是深拷贝,返回的是一个新的数组,不改变原来数组的值!!!!!!
normal()函数
按照平均值loc和方差scale生成高斯分布的数字
uniform()函数(【自定范围内】【自定维度】随机数)
实例:对数组加入随机噪声
效果如下
Numpy常用的数学统计函数
Numpy有哪些数学统计函数
np.cumsum(arr):
某个位置的值是这样得出来的,计算从arr[0]开始一直到这个位置的所有元素和(cumprod同理),用处是,累计一个东西,比如一个水电费啥的
np.percentile(百分数划分),quantile(小数划分):
就是把整个数组按值整成在一个数轴上,然后取位于百分之多少上的数(如果不是整数,就取两侧数据的平均)
举个例子:高等院校的入学考试成绩经常以百分位数的形式报告。比如,假设某个考生在入学考试中的语文部分的原始分数为 54 分。相对于参加同一考试的其他学生来说,他的成绩如何并不容易知道。但是如果原始分数54分恰好对应的是第70百分位数,我们就能知道大约70%的学生的考分比他低,而约30%的学生考分比他高。
中位数、平均数 、标准差、方差、加权平均
对于加权平均,因为arr.shape
是元组类型,例如(1,2,3)
-
如果要用
np.random.rand()
,则必须要传入“1,2,3”而非"(1,2,3)",因此要用"*"号,把元组打散成元素!!!! -
如果要用
np.random.random()
,则可以传入"(1,2,3)",变成np.random.random((1,2,3))
,就不需要用“*”打散元组了!!!
怎么实现按不同的axis计算
举个例子:
当axis=0时,就是把整个数组上下压扁,压成一行
当axis=1时,就是把整个数组左右压扁,压成一列,然后再横着排成一行
实例:机器学习中将数据进行标准化
- 小知识点:Numpy的广播
如图,arr为3×4的矩阵,但是mean是每一列平均值组成的,是1×4的矩阵,这时候他会自动把后者复制成三份,变成3×4的矩阵,再和arr进行运算。这就是numpy的广播。
例子:
效果如下:
标准化的公式要牢记嗷!!!
标准化的公式要牢记嗷!!!
标准化的公式要牢记嗷!!!
Numpy计算数组中满足条件的个数
需求:有一个非常大的数组比如1亿个数字,求出里面数字小于5000的数字数目
1.使用numpy的random模块生成1亿个数字
2.使用Python原生语法实现
3.使用numpy的向量化操作实现
这里用到了Numpy的布尔索引
对比体会一下python原生语法的遍历和numpy的bool索引!!!
对比体会一下python原生语法的遍历和numpy的bool索引!!!
对比体会一下python原生语法的遍历和numpy的bool索引!!!
Numpy怎么给数组增加一个维度
方法1:np.newaxis关键字
- 咋理解呢?
就是逗号左边是行,右边是列,然后np.newaxis
在左边的时候意思就是:添加了空的行
如果np.newaxis
在逗号右边,意思就是:添加了空的列!!!
方法2:np.expand_dims方法
其效果和上面np.newanxis
关键字一摸一样(不过感觉这个好理解啊)
axis=0
则是添加空行,这个之前用mean、sum、average等进行每一列的计算时的想法相同,都是液压机压缩的方法,axis=1
则是左右压缩!!!
方法3:np.reshape方法
因为我们很多时候,其实数据太多,不知道到底有多少数据
这个时候就用“-1”来让Numpy自己算到底有多少数据即可!!!
Numpy非常重要的数组合并操作
- 行合并的三种方法
- 列合并的三种方法