numpy库
-
开源,方便使用数组、矩阵
-
安装库
-
使用Python时,可以通过包管理器pip安装numpy
pip install numpy
-
使用anaconda时,不需要安装,anaconda本身已有numpy库
-
-
导入库
import numpy as np
数组对象(ndarray)
- numpy定义了一个n维数组对象,简称ndarray对象,它是一个一系列相同类型元素组成的数组集合
- 相比直接用Python列表操作更高效
1. 创建数组
-
从列表产生数组:
np.array
lis = [2,4,6,8] a = np.array(lis) a ## 输出结果: array([2, 4, 6, 8])
-
从列表传入:
np.array
a = np.array([2,4,6,8]) a ## 输出结果: array([2, 4, 6, 8])
-
生成全为0或全为1的数组:
np.zeros
与np.ones
np.zeros(5) ## 输出结果(默认是浮点型数据): array([0., 0., 0., 0., 0.])
np.ones(5,dtype = int) ## 输出结果: array([1, 1, 1, 1, 1])
-
使用fill方法将数组设为指定值:
a = np.array([2,4,6,8]) a.fill(5) a ## 输出结果: array([5, 5, 5, 5])
a = np.array([2,4,6,8]) a = a.astype('float') #将数组a中元素都转换为浮点型 a.fill(2.5) a ## 输出结果: array([2.5, 2.5, 2.5, 2.5])
-
生成整数序列:
np.arange
a = np.arange(1,10) #参数分别为起始值(包含)、结束值(不包含),即左闭右开 b = np.arange(1,10,2) #参数分别为起始值(包含)、结束值(不包含)、间隔 print(a,b) ## 输出结果: [1 2 3 4 5 6 7 8 9] [1 3 5 7 9]
-
生成等差数列:
np.linspace
a = np.linspace(1,10,21) #参数分别为起始值(包含)、结束值(包含)、需要生成的元素个数 a ## 输出结果: array([ 1. , 1.45, 1.9 , 2.35, 2.8 , 3.25, 3.7 , 4.15, 4.6 , 5.05, 5.5 , 5.95, 6.4 , 6.85, 7.3 , 7.75, 8.2 , 8.65, 9.1 , 9.55, 10. ])
-
生成随机数:
np.random
np.random.rand(5) #随机生成0到1之间的5个数 ## 输出结果: array([0.9382636 , 0.45850526, 0.27829649, 0.33843361, 0.06855943])
np.random.randn(5) #随机生成服从标准正态分布的5个数 ## 输出结果: array([ 0.9033228 , -2.09249594, -0.18305873, 1.55344348, 0.56880628])
np.random.randint(1,10,5) #随机生成1-10之间的5个整数 ## 输出结果: array([4, 6, 2, 2, 4])
2. 数组属性
首先定义一个数组 a = np.array([[2,4,6,8],[1,3,5,7]])
-
查看类型
type(a) ## 输出结果: numpy.ndarray #numpy中的n维数组
-
查看数组中元素的数据类型
a.dtype ## 输出结果: dtype('int32')
-
查看形状尺寸
a.shape 或 np.shape(a) ## 输出结果: (2, 4) #返回元组,每个元素代表这一维的元素个数
-
查看数组中元素个数
a.size ## 输出结果: 8
-
查看数组维度
a.ndim ## 输出结果: 2
3. 索引与切片
3.1 一维数组
首先定义一个简单的一维数组 a = np.array([2,4,6,8,10,12])
-
索引
数组索引与列表一样,也是从0开始
a[2] #访问数组a中索引为2的元素 ## 输出结果: 6
-
修改数组中元素的值
与列表一样,直接对其赋值
a[1] = 2 a ## 输出结果: array([ 2, 2, 6, 8, 10, 12])
-
切片
支持负索引
a[1:3] ## 输出结果: array([2, 6])
a[::2] #从头取到尾,间隔为2 ## 输出结果: array([ 2, 6, 10])
a[-5:2] ## 输出结果: array([2])
3.2 多维数组
定义一个二维数组 a = np.array([[1,3,5,7,9],[2,4,6,8,10],[11,13,15,17,19],[12,14,16,18,20]])
-
切片时先写行索引,再写列索引,中间用逗号隔开
a[1,2] #数组a的行索引为1,列索引为2的元素,即第2行第3列元素 ## 输出结果: 6
a[:2,::2] #行索引为0和1,列索引为0,2,4的元素 ## 输出结果: array([[ 1, 5, 9], [ 2, 6, 10]])
a[:,2] #第3列元素 ## 输出结果: array([ 5, 6, 15, 16])
-
数组的切片是引用机制,意味着Python并没有给切出来的元素分配新的存储空间,而是让它指向了原始数组所分配的内存空间。因此,当对切片切出来的变量重新赋值时,原始数组相应的值也会改变,列表的切片不具有引用机制。例如:
a = np.array([2,4,5,6,7]) b = a[2:4] b[0] = 0 a ## 输出结果: array([2, 4, 0, 6, 7])
要想给切片出来的b分配新的内存空间,可以使用
copy()
方法产生一个复制,例如:a = np.array([2,4,5,6,7]) b = a[2:4].copy() b[0] = 0 a ## 输出结果: array([2, 4, 5, 6, 7])
4. 花式索引
-
一维
-
通过列表索引
a = np.array([0,2,4,6,8,10,12,14,16,18]) lst = [0,1,3,8] a[lst] ## 输出结果: array([ 0, 2, 6, 16])
-
通过布尔数组索引
a = np.array([0,2,4,6,8,10,12,14,16,18]) b = np.array([0,4,0,3,0,0,-2,0,0,1], dtype = bool) a[b] #取布尔数组b中True对应位置的索引,b必须与a等长 ## 输出结果: array([ 2, 6, 12, 18])
-
-
二维
-
通过指定行和列索引
a = np.array([[1,3,5,7,9],[2,4,6,8,10],[11,13,15,17,19],[12,14,16,18,20]]) a[(1,2),(0,4)] #行索引为1,列索引为0的元素,以及行索引为2列索引为4的元素 ## 输出结果: array([ 2, 19])
-
通过布尔数组索引
a = np.array([[1,3,5,7,9],[2,4,6,8,10],[11,13,15,17,19],[12,14,16,18,20]]) b = np.array([2,1,0,5,0],dtype = bool) a[1:3,b] #行索引为1、2,列索引为b数组中True对应的索引 ## 输出结果: array([[ 2, 4, 8], [11, 13, 17]])
-
-
花式索引不具有引用机制,直接复制过来
5. where语句
np.where(a)
返回数组a中所有非零元素索引
a = np.array([1,3,0,5,7,0,9])
np.where(a) #返回数组a中非零元素的索引
## 输出结果:
(array([0, 1, 3, 4, 6], dtype=int64),) #返回的是元组的形式
a = np.array([1,3,0,5,7,0,9])
np.where(a > 5) #返回数组a中大于5的元素的索引
## 输出结果:
(array([4, 6], dtype=int64),)
a = np.array([1,3,0,5,7,0,9])
a[a > 5] #返回数组a中大于5的元素
## 输出结果:
array([7, 9])
a = np.array([1,3,0,5,7,0,9])
a[np.where(a > 5)] #返回数组a中大于5的元素
## 输出结果:
array([7, 9])
6. 数组类型
-
数组类型有布尔型、整型、无符号整型、浮点数、复数、字符串、对象、时间
-
类型转换
-
asarray函数
a = np.array([1,2,3]) np.asarray(a,dtype = float) #将数组a中元素改为浮点型,作为一个新的数组返回,原本的数组a没有改变,仍是整型 ## 输出结果: array([1., 2., 3.])
-
astype函数
a = np.array([1,2,3]) a.astype(float) #将数组a中元素改为浮点型,作为一个新的数组返回,原本的数组a没有改变,仍是整型 ## 输出结果: array([1., 2., 3.])
-
7. 数组操作
7.1 一维数组操作
首先定义几个一维数组:
mv_name = np.array(['肖申克的救赎','控方证人','美丽人生','阿甘正传','霸王别姬','泰坦尼克号','辛德勒的名单','这个杀手不太冷','疯狂动物城','海豚湾'])
mv_num = np.array([692795,42995,327855,580897,47853,157074,306904,662552,284652,159302])
mv_score = np.array([9.6,9.5,9.5,9.4,9.4,9.4,9.4,9.3,9.3,9.3])
mv_length = np.array([142,116,116,142,171,194,195,133,109,92])
-
数组排序
-
sort函数
np.sort(mv_num) #默认从小到大排序,返回新数组,不改变原数组 ## 输出结果: array([ 42995, 47853, 157074, 159302, 284652, 306904, 327855, 580897, 662552, 692795])
-
argsort函数
np.argsort(mv_num) #返回从小到大的排列在数组中的索引位置 ## 输出结果: array([1, 4, 5, 9, 8, 6, 2, 3, 7, 0], dtype=int64)
-
-
求和
-
sum函数
np.sum(mv_num) #返回数组中元素的和 ## 输出结果: 3262879
mv_num.sum() #返回数组中元素的和 ## 输出结果: 3262879
-
-
最大值
-
max函数
np.max(mv_length) #返回数组中最大的元素 ## 输出结果: 195
mv_length.max() #返回数组中最大的元素 ## 输出结果: 195
-
-
最小值
- min函数,用法同max函数
-
均值
- mean函数,用法同max函数
-
标准差
- std函数,用法同max函数
-
协方差矩阵
-
cov函数
np.cov(mv_score,mv_length) #返回两个数组的相关系数矩阵 ## 输出结果: array([[9.88888889e-03, 4.55555556e-01], [4.55555556e-01, 1.26288889e+03]])
-
-
numpy中其余内置函数
np.abs
绝对值np.exp
求指数np.median
中位数np.cumsum
累积和- 三角函数
7.2 多维数组操作
-
数组形状
-
shape和reshape函数
a = np.arange(6) a.shape = 2,3 #将数组a转换为2行3列的二维数组,会改变原数组 a ## 输出结果: array([[0, 1, 2], [3, 4, 5]])
a = np.arange(6) a.reshape(2,3) #将数组a转换为2行3列的二维数组,不改变原数组,返回新数组 ## 输出结果: array([[0, 1, 2], [3, 4, 5]])
-
-
转置
-
T和transpose()
a = np.array([[1,2,3],[4,5,6]]) a.T #转置,不改变原数组,返回新数组 ## 输出结果: array([[1, 4], [2, 5], [3, 6]])
a = np.array([[1,2,3],[4,5,6]]) a.transpose() #转置,不改变原数组,返回新数组 ## 输出结果: array([[1, 4], [2, 5], [3, 6]])
-
-
数组连接
-
concatenate函数
np.concatenate((x,y),axis = 0)
,默认按列拼接a = np.array([[1,2,3],[4,5,6]]) b = np.array([[11,12,13],[14,15,16]]) np.concatenate((a,b)) #默认按列拼接,若要按行拼接,axis = 1 ## 输出结果: array([[ 1, 2, 3], [ 4, 5, 6], [11, 12, 13], [14, 15, 16]])
-
通过array可以将两个相同形状的二维数组拼成三维数组
np.array((a,b)) ## 输出结果: array([[[ 1, 2, 3], [ 4, 5, 6]], [[11, 12, 13], [14, 15, 16]]])
-
numpy也提供了三个函数,分别对应上述三种情况
np.vstack((a,b))
按列拼接np.hstack((a,b))
按行拼接np.dstack((a,b))
拼成三维数组
-