科学计算包Numpy
Numpy
用于科学计算的python模块,提供了Python中没有的数组对象,支持N维数组运算、处理大型矩阵、成熟的广播函数库、矢量运算、线性代数、傅里叶变换以及随机数生成等功能,并可与C++、FORTRAN等语言无缝结合。
菜鸟教程:https://www.runoob.com/numpy/numpy-dtype.html
·导入numpy模块(打开cmd窗口)
pip install numpy
·简单应用
import numpy as np
1.生成数组
1 >>> np.array([1, 2, 3, 4, 5]) # 把列表转换为数组 2 array([1, 2, 3, 4, 5]) 3 >>> np.array((1, 2, 3, 4, 5)) # 把元组转换成数组 4 array([1, 2, 3, 4, 5]) 5 >>> np.array(range(5)) # 把range对象转换成数组 6 array([0, 1, 2, 3, 4]) 7 >>> np.array([[1, 2, 3], [4, 5, 6]]) # 二维数组 8 array([[1, 2, 3], 9 [4, 5, 6]]) 10 >>> np.arange(8) # 类似于内置函数range() 11 array([0, 1, 2, 3, 4, 5, 6, 7]) 12 >>> np.arange(1, 10, 2) #从1到10(包括1,不包括10),步长为2 13 array([1, 3, 5, 7, 9]) 14 >>> np.linspace(0, 10, 11) 15 # 等差数组,包含11个数,从0到10(包括0,也包括10,闭区间),平均分为11个数字array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]) 16 >>> np.linspace(0, 10, 11, endpoint=False) # 不包含终点 17 array([ 0. , 0.90909091, 1.81818182, 2.72727273, 3.63636364, 18 4.54545455, 5.45454545, 6.36363636, 7.27272727, 8.18181818, 19 9.09090909]) 20 >>> np.logspace(0, 100, 10) # 对数数组,从0到100,取10个数,返回10个数分别作为幂,计算基为10的结果数组 21 array([ 1.00000000e+000, 1.29154967e+011, 1.66810054e+022, 22 2.15443469e+033, 2.78255940e+044, 3.59381366e+055, 23 4.64158883e+066, 5.99484250e+077, 7.74263683e+088, 24 1.00000000e+100]) 25 >>>np.logspace(0, 10, 5) 26 array([1.00000000e+00, 3.16227766e+02, 1.00000000e+05, 3.16227766e+07, 27 1.00000000e+10]) 28 >>> np.logspace(1,6,5, base=2) # 对数数组,相当于2 ** np.linspace(1,6,5) 29 array([ 2. , 4.75682846, 11.3137085 , 26.90868529, 64. ]) 30 >>>np.logspace(1,5,5,base=2) 31 array([ 2., 4., 8., 16., 32.]) 32 >>>np.logspace(1,6,3,base=2) 33 array([ 2. , 11.3137085, 64. ]) 34 >>> np.zeros(3) # 全0一维数组 35 array([ 0., 0., 0.]) 36 >>> np.ones(3) # 全1一维数组 37 array([ 1., 1., 1.]) 38 >>> np.zeros((3,3)) # 全0二维数组,3行3列 39 array([[ 0., 0., 0.], 40 [ 0., 0., 0.], 41 [ 0., 0., 0.]]) 42 >>> np.zeros((3,1)) # 全0二维数组,3行1列 43 array([[ 0.], 44 [ 0.], 45 [ 0.]]) 46 >>> np.zeros((1,3)) # 全0二维数组,1行3列 47 array([[ 0., 0., 0.]]) 48 >>> np.ones((3,3)) # 全1二维数组 49 array([[ 1., 1., 1.], 50 [ 1., 1., 1.], 51 [ 1., 1., 1.]]) 52 >>> np.ones((1,3)) # 全1二维数组 53 array([[ 1., 1., 1.]]) 54 >>> np.identity(3) # 单位矩阵 55 array([[ 1., 0., 0.], 56 [ 0., 1., 0.], 57 [ 0., 0., 1.]]) 58 >>> np.identity(2) 59 array([[ 1., 0.], 60 [ 0., 1.]]) 61 >>> np.empty((3,3)) # 空数组,只申请空间而不初始化,元素值是不确定的 62 array([[ 0., 0., 0.], 63 [ 0., 0., 0.], 64 [ 0., 0., 0.]]) 65 >>> np.random.randint(0, 50, 5) # 随机数组,5个0到50之间的数字 66 array([13, 47, 31, 26, 9]) 67 >>> np.random.randint(0, 50, (3,5)) # 3行5列 68 array([[34, 2, 33, 14, 40], 69 [ 9, 5, 10, 27, 11], 70 [26, 17, 10, 46, 30]]) 71 >>> np.random.rand(10) 72 array([ 0.98139326, 0.35675498, 0.30580776, 0.30379627, 0.19527425, 73 0.59159936, 0.31132305, 0.20219211, 0.20073821, 0.02435331]) 74 >>> np.random.standard_normal(5) # 从标准正态分布中随机采样 75 array([ 2.82669067, 0.9773194 , -0.72595951, -0.11343254, 0.74813065])
2.数组与数值的算术运算
>>> a=np.array((1,2,3,4,5)) >>> a+2 array([3, 4, 5, 6, 7]) >>> a-2 array([-1, 0, 1, 2, 3]) >>> a*2 array([ 2, 4, 6, 8, 10]) >>> a/2 array([0.5, 1. , 1.5, 2. , 2.5]) >>> a//2 array([0, 1, 1, 2, 2], dtype=int32) >>> a**2 array([ 1, 4, 9, 16, 25], dtype=int32)
3.数组与数组的算术运算
>>> a=np.array((1,2,3)) >>> b=np.array(([1,2,3],[4,5,6],[7,8,9])) >>> a+b array([[ 2, 4, 6], [ 5, 7, 9], [ 8, 10, 12]]) >>> a-b array([[ 0, 0, 0], [-3, -3, -3], [-6, -6, -6]]) >>> a*b array([[ 1, 4, 9], [ 4, 10, 18], [ 7, 16, 27]]) >>> a//b array([[1, 1, 1], [0, 0, 0], [0, 0, 0]], dtype=int32)
4.二维数组转置
>>> b=np.array(([1,2,3],[4,5,6],[7,8,9])) >>> b array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) >>> print(b.T) [[1 4 7] [2 5 8] [3 6 9]]
5.向量点积
>>> a=np.array((5,6,7)) >>> b=np.array((6,6,6)) >>> np.dot(a,b) 108
6.数组元素访问
>>> b=np.array(([1,2,3],[4,5,6],[7,8,9])) >>> b[0,0] 1 >>> b[0][2] 3
多元素同时访问
>>> x = np.arange(0,100,10,dtype=np.floating) >>> x array([ 0., 10., 20., 30., 40., 50., 60., 70., 80., 90.]) >>> x[[1, 3, 5]] # 同时访问多个位置上的元素 array([ 10., 30., 50.])
7.三角函数运算
>>> b=np.array(([1,2,3],[4,5,6],[7,8,9])) >>> np.sin(b) array([[ 0.84147098, 0.90929743, 0.14112001], [-0.7568025 , -0.95892427, -0.2794155 ], [ 0.6569866 , 0.98935825, 0.41211849]])
8.四舍五入
>>> np.round(np.sin(b)) array([[ 1., 1., 0.], [-1., -1., -0.], [ 1., 1., 0.]])
9.对矩阵不同维度上的元素进行求和
>>> x=np.arange(0,10).reshape(2,5) >>> x array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) >>> np.sum(x) 45 >>> np.sum(x,axis=0) #每列求和 array([ 5, 7, 9, 11, 13]) >>> np.sum(x,axis=1) #每行求和 array([10, 35])
10.计算矩阵不同维度上元素的均值
>>> np.average(x,axis=0) array([2.5, 3.5, 4.5, 5.5, 6.5]) >>> np.average(x,axis=1) array([2., 7.])
11.计算数据的标准差与方差
>>> x=np.random.randint(0,10,size=(3,3)) >>> x array([[5, 3, 5], [3, 6, 2], [6, 0, 9]]) >>> np.std(x) #标准差 2.494438257849294 >>> np.std(x,axis=1) #列行标准差
array([0.94280904, 1.69967317, 3.74165739]) >>> np.var(x) #方差 6.222222222222222
12.对矩阵不同维度上的元素求最大值
>>> x=np.random.randint(0,10,size=(3,3)) >>> x array([[2, 6, 9], [1, 8, 3], [0, 9, 8]]) >>> np.max(x) 9 >>> np.max(x,axis=1) #每列最大值 array([9, 8, 9])
13.对矩阵不同维度上的元素进行排序
>>> np.sort(x) array([[2, 6, 9], [1, 3, 8], [0, 8, 9]]) >>> np.sort(x,axis=0) array([[0, 6, 3], [1, 8, 8], [2, 9, 9]])
14.生成特殊数组
>>> np.empty((3,3)) #只申请空间,不初始化,速度很快 array([[0.00000000e+000, 0.00000000e+000, 0.00000000e+000], [0.00000000e+000, 0.00000000e+000, 4.82208070e-321], [1.86918698e-306, 1.78021662e-306, 2.46155235e-312]])
15.改变数组大小
>>> a=np.arange(1,11,1) >>> a array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) >>> a.shape=2,5 >>> a array([[ 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10]]) >>> a.shape=5,-1 #-1表示自动计算 >>> a array([[ 1, 2], [ 3, 4], [ 5, 6], [ 7, 8], [ 9, 10]]) >>> a.reshape(2,5) array([[ 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10]])
16.切片操作
>>> a=np.arange(10) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> a[::-1] array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0]) >>> a[::2] array([0, 2, 4, 6, 8]) >>> c=np.array([[j*10+ i for i in range(6)] for j in range (6)]) >>> c array([[ 0, 1, 2, 3, 4, 5], [10, 11, 12, 13, 14, 15], [20, 21, 22, 23, 24, 25], [30, 31, 32, 33, 34, 35], [40, 41, 42, 43, 44, 45], [50, 51, 52, 53, 54, 55]]) >>> c[0,3:5] #取第0行第三个和第四个元素 array([3, 4])
17.布尔运算
>>> x=np.random.rand(10) >>> x array([0.10905435, 0.57768227, 0.18788365, 0.23399672, 0.93576621, 0.62251011, 0.54649539, 0.37180411, 0.72779445, 0.05535632]) >>> x>0.5 array([False, True, False, False, True, True, True, False, True, False]) >>> x[x>0.5] #取出所有大于0.5的元素 array([0.57768227, 0.93576621, 0.62251011, 0.54649539, 0.72779445]) >>> np.array([1,2,3]) < np.array([3,2,1]) array([ True, False, False]) >>> np.array([1,2,3]) == np.array([3,2,1]) array([False, True, False])
18.取整运算
>>> x=np.random.rand(10)*50 >>> x array([19.13213223, 38.14702133, 41.30754565, 19.51765474, 19.73843457, 25.66530995, 34.74361578, 12.44682723, 6.03817843, 34.18593124]) >>> np.array([t-int(t) for t in x]) #获取小数部分 array([0.13213223, 0.14702133, 0.30754565, 0.51765474, 0.73843457, 0.66530995, 0.74361578, 0.44682723, 0.03817843, 0.18593124])
19.广播
>>> a=np.arange(0,60,10).reshape(-1,1) >>> b=np.arange(0,6) >>> a array([[ 0], [10], [20], [30], [40], [50]]) >>> b array([0, 1, 2, 3, 4, 5]) >>> a+b array([[ 0, 1, 2, 3, 4, 5], [10, 11, 12, 13, 14, 15], [20, 21, 22, 23, 24, 25], [30, 31, 32, 33, 34, 35], [40, 41, 42, 43, 44, 45], [50, 51, 52, 53, 54, 55]])
20.分段函数
>>> x=np.random.randint(0,10,size=(1,10)) >>> x array([[4, 4, 8, 9, 0, 0, 4, 0, 3, 5]]) >>> np.where(x<5,0,1) #选出小于5,0,1的数 array([[0, 0, 1, 1, 0, 0, 0, 0, 0, 1]]) >>>np.piecewise(x,[x<7,x>4],[lambda x:x*2,lambda x:x*3]) #小于7的数乘2,大于4的数乘3 array([[ 8, 8, 24, 27, 0, 0, 8, 0, 6, 15]])
21.计算唯一值以及出现次数
>>> x=np.random.randint(0,10,10) >>> x array([1, 1, 0, 2, 7, 1, 6, 6, 9, 7]) >>> np.unique(x) #计算唯一值 array([0, 1, 2, 6, 7, 9]) >>> np.bincount(x) #计算出现的次数,但是因为访问是无序的,所以最后并不是顺序计数 array([1, 3, 1, 0, 0, 0, 2, 2, 0, 1], dtype=int64)
22.计算加权平均值
>>> y=np.array([round(i,1) for i in list (np.random.random(10))]) >>> y array([0.2, 0. , 0.6, 0.3, 0.7, 0. , 0.7, 0.4, 0.8, 0.7]) #随机生成10个0-1之间的带一位小数的数 >>> np.sum(x*y)/np.sum(np.bincount(x)) #平均值 2.44
23.矩阵运算
>>> a_list=[3,5,7] >>> a_mat=np.matrix(a_list) #设置为矩阵库 >>> a_mat matrix([[3, 5, 7]]) >>> np.shape(a_mat) #矩阵为一行三列 (1, 3) >>> b_mat=np.matrix((1,2,3)) >>> b_mat matrix([[1, 2, 3]]) >>> a_mat * b_mat.T #矩阵乘法 matrix([[34]]) >>> a_mat.argsort() #返回的是数组值从小到大的索引值 matrix([[0, 1, 2]], dtype=int64) >>> a_mat.sum() 15 >>> a_mat matrix([[3, 5, 7]]) >>> a_mat.mean() 5.0 >>> a_mat.max() 7