numpy是由c语言编写的,运行速度比python 循环快很多
在数据处理的过程中,遇到使用 python for循环实现一些向量化,矩阵化操作的时候,要优先考虑用numpy
numpy数组的创建1 从列表开始创建
x=np.array([1,1,2,3,4,5]) print(x) print(type(x)) print(x.shape) [1 1 2 3 4 5](6,)
设置数组的数据类型
x=np.array([1,1,2,3,4,5],dtype="float32") print(x) print(type(x[0])) [1. 1. 2. 3. 4. 5.]
创建二维数组
x=np.array([[1,2,3],[1,2,3],[1,2,3]]) print(x) print(x.shape) [[1 2 3] [1 2 3] [1 2 3]] (3, 3)从头创建数组
很多时候我们要从无到有初始化一个数组
1 创建长度为5的数组,值都为0
np.zeros(5,dtype=int) array([0, 0, 0, 0, 0])
2 创建一个2*4 的浮点型数组,值都为1
np.ones((2,4),dtype=float)
array([[1., 1., 1., 1.],
[1., 1., 1., 1.]])
3 创建一个3*5 的数组,值都为8.8
np.full((3,5),8.8)
array([[8.8, 8.8, 8.8, 8.8, 8.8],
[8.8, 8.8, 8.8, 8.8, 8.8],
[8.8, 8.8, 8.8, 8.8, 8.8]])
4 创建一个3*3 的单位矩阵
np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
5 创建一个线性序列数组,从1开始,到15结束,步长为2
np.arange(1,15,2) array([ 1, 3, 5, 7, 9, 11, 13])
6 创建一个4 个元素的数组,这四个数均匀的分配到0-1
np.linspace(0,1,4) array([0. , 0.33333333, 0.66666667, 1. ])
7 创建一个10个元素的数组,形成1-10^9的等比数列
np.logspace(0,9,10)
array([1.e+00, 1.e+01, 1.e+02, 1.e+03, 1.e+04, 1.e+05, 1.e+06, 1.e+07,
1.e+08, 1.e+09])
8 创建一个3*3的,在0-1之间均匀分布的随机数构成的数组
np.random.random((3,3))
array([[0.33801855, 0.08572858, 0.07522315],
[0.5341442 , 0.95755562, 0.50914591],
[0.6047257 , 0.29996185, 0.78148356]])
9 创建一个3*3 ,均值为0,标准差为1的正态分布随机数构成的数组
np.random.randint(0,10,(3,3))
array([[3, 5, 6],
[6, 5, 5],
[0, 2, 4]])
10 创建一个3*3 ,在[0,10]之间随机整数构成的数组
np.random.randint(0,10,(3,3))
array([[3, 5, 6],
[6, 5, 5],
[0, 2, 4]])
11 随机重排列
x=np.array([10,20,30,40]) np.random.permutation(x) array([20, 10, 40, 30])数组的性质
x=np.random.randint(10,size=(3,4))
x
array([[6, 7, 7, 5],
[9, 8, 8, 6],
[5, 5, 8, 6]])
数组的形状 shape
x.shape (3, 4)
数组的数据类型dtype
x.dtppe
dtype('int32')
数组的维度ndim
x.ndim 2
数组的大小size
x.size 12数组的索引
一维数组和列表一致
多维数组—以二维数组为例:
x[0,0] x[0][0]
x[0] [0] 相当于先取第0行,再取第0个元素
上面两种结果相等
注意:numpy数组的数据类型是固定的,向一个整形数组插入一个浮点值,浮点值会向下进行取整
数组的切片一维数组切片和列表一样
多维数组—以二维数组为例
x[:2,:3] #前两行,前三列
array([[6, 7, 7],
[9, 8, 8]])
x[:2,0:3:2] #前两行 前三列(每隔一列)
array([[6, 7],
[9, 8]])
x[::-1,::-1] #行列反向输出
array([[6, 8, 5, 5],
[6, 8, 8, 9],
[5, 7, 7, 6]])
获取数组的行和列
x[1,:] #第一行 array([9, 8, 8, 6]) x[1] #第一行简写 x[:,2] #第二列,从0开始计数
注意:切片获取的是视图,而非副本
视图元素发生修改,则原数组亦也会发生相应的修改
修改切片的安全方式: copy
数组的变形x.reshape(1,12) array([[6, 7, 7, 5, 9, 8, 8, 6, 5, 5, 8, 6]])
reshape后面的参数大小一定要和原来的对应的上
注意:reshape返回的是视图,而非副本
多维向量转一维向量可以直接 x.flatten() 或者 x.rave() 或者 x.reshpe(-1)
flatten返回的是一个副本
ravel返回的是视图
数组的拼接水平拼接 要求有相同的行数
x1=np.array([[1,2,3],
[1,2,3]])
x2=np.array([[2,3,5]
,[6,7,8]])
x3=np.hstack([x1,x2])
x3
array([[1, 2, 3, 2, 3, 5],
[1, 2, 3, 6, 7, 8]])
垂直方向的拼接: np.vatack() 要求有相同的列数
数组的分裂1 split的用法
x=np.arange(10) x array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) x1,x2,x3=np.split(x,[2,7]) #后面的列表表示要从2,7这里分 print(x1,x2,x3) [0 1] [2 3 4 5 6] [7 8 9]
2 hsplit的用法
x=np.arange(1,26).reshape(5,5)
x
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25]])
left,mid,right=np.hsplit(x,[2,4]) #后面的列表是 对第二列和第四列进行分割
print("left:n",left)
print("mid:n",mid)
print("right:n",right)
left:
[[ 1 2]
[ 6 7]
[11 12]
[16 17]
[21 22]]
mid:
[[ 3 4]
[ 8 9]
[13 14]
[18 19]
[23 24]]
right:
[[ 5]
[10]
[15]
[20]
[25]]
vsplit 的用法
vsplit与hsplit一样,只不过是对行进行分割
numpy四大运算1 与数字的加减乘除等
x=np.arange(1,6) print(x+2) [3 4 5 6 7]
数组里面的所有元素都会参与运算
2 绝对值,三角函数,指数,对数
绝对值: abs()
三角函数 np.sin(),np.cos(),
指数运算: np.exp()
对数运算: np.log(x)—以2为底,np.log10(x)----以10为底
两个数组的运算是对应位置上的运算
矩阵运算矩阵的转置 .T
x=np.arange(9).reshape(3,3)
x.T
array([[0, 3, 6],
[1, 4, 7],
[2, 5, 8]])
矩阵的乘法dot()
x2=x.T
x3=x2.dot(x)
x3
array([[45, 54, 63],
[54, 66, 78],
[63, 78, 93]])
广播运算
如果两个数组的形状在维度上不匹配
那么数组的形状会沿着维度为1的维度进行扩展以匹配另一个数组的形状
比较运算和掩码
x=np.arange(10)
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x>5
array([False, False, False, False, False, False, True, True, True,
True])
x[x>5] array([6, 7, 8, 9])



