import numpy as np
一、为何用numpy?
1 numpy为何如此高效?
numpy是由c语言编写的
1 编译型语言vs解释型语言:C语言执行时,整体速度更快
2 连续单一存储vs分散多变类型存储
nunpy数组内数据类型必须是一致的
numpy数组内存储在连续内存中,python列表分散存储在内存中
3 多线程vs线程锁
python执行时,有线程锁,无法实现真正的多线程并行,c语言则可以
2 什么时候用numpy?
在数据处理过程中,需要使用python实现向量化矩阵化操作的时候,优先考虑numpy
如:两个向量相乘、矩阵乘法
二、numpy的创建
1 从列表创建
基本格式:x=np.array([列表])
设置数组类型:x=np.array([列表],dtype=“数据类型”)
二维数组的创建:x=np.array([[1,2,3],
[4,5,6]])
2 从头构建数组
构建全0数组
np.zeros(5,dtype=int) 一维数组,元素为整型
np.zeros((2,2),dtype=float) 二维数组,元素为浮点型
构建2*4的浮点型数组,值为1
np.ones((2,4),dtype=float)
构建3*5的数组,值为8.8
np.full((3,5),8.8)
创建一个3*3的单位阵
np.eye(3)
创建一个序列数组,1开始到15结束,步长为2
np.arange(1,15,2)
等差数列
np.linspace(0,1,4)
等比数列
np.logspace(0,9,10)
创建3*3在(0,1)之间均匀分布的数组
np.random.random((3,3))
创建一个3*3,均值为0,标准差为1的高斯分布数组
np.random.normal(0,1,(3,3))
创建一个3*3 [0,10)之间随机整数构成的整数组
np.random.randint(0,10,(3,3))
随机重排
法一:np.random.permutation(x)--该方法不修改原列表,而是产生一个新副本
法二:np.random.shuffle(x)--该方法直接对原列表进行重排操作
随机采样
按指定形状采样:np.random.choice(x,size=(a,b))
按概率采样:np.random.choice(x,size=(a,b),p=x/sum(x))
三、numpy的性质
1 数组的属性
形状:x.shape
维度:x.nidm
大小:x.size--就是元素的个数
2 数组的索引
一维数组的索引
x[0],x[5],x[-1]---与列表的索引一样
多维数组的索引--以二维数组为例
x[1][1]或者x[1,1]都可
3 数组的切片
一维数组的切片--与列表一样
x[:3]
x[3:]
x[::-1]
多维数组的切片--以二维为例
x[:2,:3]
x[:2,0:3:2]
x[::-1,::-1]
获取数据的行和列
x[1,:]--第一行
x[:,2]--第二列
ps:数据的切片获取的是视图,而非副本,改变切片值原数据也会随之发生改变
想要只修改切片,原数据不改变的方式
x1=x[:2,:2].copy()
4 数据的变形--reshape((型状))
x.reshape((形状))
一维向量转行向量:x1=x.reshape(1,x.shape[0]) / x1=x[np.newaxis,:]
一维向量转列向量:x1=x.reshape(x.shape[0],1) / x1=x[:,np.newaxis]
多维向量转一维向量
x1=x.flatten()--返回副本
x1=x.reval()--返回视图
x1=x.reshape(-1)--返回视图
5 数组的拼接
水平拼接:np.hstack([x1,x2]) np.c_[x1,x2]
垂直拼接:np.vstack([x1,x2]) np.r_[x1,x2]
返回值都是一个副本
6 数组的分裂
一维数据分裂:x1,x2,x3=np.split(x,[2,7])
行数据分裂:left,middle,right=np.hsplit(x,[2,4])
列数据分裂:up.middle,down=np.vsplit(x,[2,4])
四、Numpy的四大运算
1 向量化运算
1)与数字的加减乘除
2)绝对值、三角函数、指数、对数
绝对值:abx(x)
三角函数:np.sin(theta) np.cos(theta) np.tan(theta) np.arcsin(x) np.arccos(x) np.arctan(x)
指数:np.exp(x)
对数:np.log(x) np.log2(x) np.log10(x)
3) 两个数组的运算
2 矩阵运算
转置:x.T
乘法:x.dot(y) np.dot(x,y) y.dot(x) np.dot(y,x)
3 广播运算
规则:
如果两个数组形状在维度上不匹配
那么数组的形式会沿着维度为1的维度进行扩展以匹配另一个数组的形状
4 比较运算和掩码
1)比较运算
x>50--返回bool矩阵,满足的元素True,不满足的False
2)操作布尔数组
np.sum(x>5) 计算数据中,大于5的元素个数
np.all(x>=0) 元素是否全部大于等于0
np.any(x==6) 是否有元素等于6
np.all(x<8,axis=1) 每一行是否都小于8 axis=1按行,axis=0按列
3)将布尔数组作为掩码
x[x>5]--返回x中大于5的元素
5 花哨的索引
1)一维数组
ind=[2,6,9]
x[ind]
ind=np.array([[1,0],
[2,3]])
x[ind]
返回的x取值来自x的元素,形状与ind相同
2)多维数组
row=np.array([0,1,2])
col=np.([1,3,0])
x[row,col]
五、其它numpy的通用函数
1 数值排序
np.sort(x)--不改变原数组,产生新数组
x.sort()--永久性改变原数组
获取排序的索引信息
np.argsort(x)
2 最大值最小值
np.max(x) np.max(x,axis=1)
np.min(x)
加arg是求最大值最小值的索引
np.argmax(x)
np.argmin(x)
3 数值求积、求和
np.sum(x)
按行求和:np.sum(x,axis=1)
按列求和:np.sum(x,axis=0)
np.prod(x)
np.prod(x,axis=1)
np.prod(x,axis=0)
4 中位数、均值、方差、标准差
中位数:np.median(x)
均值:np.mean(x)
方差:np.var(x)
标准差:np.std(x)