机器学习入门--Numpy基础



一、前言

  本文基于liuyubobobo老师机器学习视频做成的个人总结博客,仅供分享,欢迎大家一起探讨与交流。
  建议大家在学习时,自己多敲代码去实践,在不断尝试中 掌握相应的方法。


二、编译环境

 IDE:Jupyter Notebook
 库 : Numpy


三、Numpy基础


(一)创建numpy.array的方法

  1.np.array()

	 import numpy as np
     np.arr1 = np.array([1,2,3,4])  #创建一维数组
     output:array([1,2,3,4])
     
     np.arr2 = np.array([[1,2,3],  	#创建二维数组,同理可创建多维数组
     					 [4,5,6]])
     output:array([[1, 2, 3],
       			   [4, 5, 6]])
       				
     np.arr3 = np.array([i for i in range(10)]) #也可利用列表初始化
     output:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
     

  说明:在numpy.array中,只能有一种数据类型,不能修改为其他类型,例如:整型数组内不能存入字符,这点不同于array.array方法;另外当我们在整型数组中存入浮点类型时,会自动隐式类型转换,具体细节可通过help(np.array)查看官方文档

  2.np.zeros()、np.ones()、np.full()

	arr1 = np.zeros(shape=(2,3),dtype='float64')
	output:array([[0., 0., 0.],
       			  [0., 0., 0.]])
	'''创建全0数组或矩阵
	   第一个参数:大小/形状
	   第二个参数:存入的参数类型(默认为浮点类型)'''
	   
	arr2 = np.ones(shape=(2,3),dtype='float64')
	output:array([[1., 1., 1.],
       				[1., 1., 1.]])
	'''创建全1数组或矩阵
	   第一个参数:大小/形状
	   第二个参数:存入的参数类型(默认为浮点类型)'''
	
	arr3 = np.full(shape=(2,3),fill_value=666;dtype='float64')
	output:array([[666., 666., 666.],
       			  [666., 666., 666.]])
	'''创建数值全为"fill_value"的数组或矩阵
	   第一个参数:生成数组的大小/形状
	   第二个参数:数值
	   第三个参数:存入的参数类型(默认为整数类型)'''
	   

  3.np.eye()

	arr1 = np.eye(N=3,M=2,k=1,dtype='float')
	output:array([[0., 1.],
       			  [0., 0.],
       			  [0., 0.]])
       			
	arr2 = np.eye(N=3,M=3,k=0,dtype='float')
	output:array([[1., 0., 0.],
       			  [0., 1., 0.],
       			  [0., 0., 1.]])
    
     '''第一个参数:行数
     	第二个参数:列数
     	第三个参数:默认情况下输出的是对角线全“1”,其余全
     	“0”的方阵,如果k为正整数,则在右上方第k条对角线全
     	“1”其余全“0”,k为负整数则在左下方第k条对角线全“1”
     	其余全“0”。
     	第四个参数:参数类型,默认为浮点类型'''
     	

  4.np.arange()、np.linspace()

	arr1 = np.arange(0,10,1)
	output:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
	'''在[0,10)生成一个步长为1的数组
	   第一个参数:起始位置(默认为0)
	   第二个参数:终结位置
	   第三个参数:步长(默认为1)
	   注意:范围是左闭右开区间
	'''
	
	arr2 = np.linspace(0,5,6)
	output:array([0., 1., 2., 3., 4., 5.])
	'''在[0,5]生成等步长的6个值
	   第一个参数:起始位置
	   第二个参数:终止位置
	   第三个参数:生成值得数量
	   说明:该函数内还有其他参数,在此不一一说明,如有兴趣
	   可通过help()进行查看'''
	   

  5.np.random()

	arr1 = np.random.randint(0,10,size=10) #生成含有10个在[0,10)内元素的向量
	output:array([0, 8, 0, 3, 5, 1, 9, 1, 7, 9])
	arr2 = np.random.randint(0,10,size=(2,3)) #size参数也可为元组,此时生成一个二维的矩阵
	output:array([[1, 4, 6],
       			  [2, 2, 3]])
    
    arr3 = np.random.random(size=(2,3)) #生成0——1之间的浮点数
    output:array([[0.70043712, 0.84418664, 0.67651434],
       				[0.72785806, 0.95145796, 0.0127032 ]])
       				
    arr4 = np.random.normal(loc=0,scale=1,size=(2,3))
    output:array([[-0.57172145, -0.10949727,  0.01902826],
       [-0.94376106,  0.64057315, -0.78644317]])
    '''生成符合均值为0方差为1分布的随机浮点数
       第一个参数:均值
       第二个参数:方差
       第三个参数:生成的数组大小/形状'''
       

  说明:可通过np.random.seed()的方式加入随机种子,保证每次生成的随机数相同

(二)numpy.array的基本操作

  1.基本属性

	'''初始化数组/矩阵'''
	x1 = np.arange(0,20,2)
	output:array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])
	x2 = np.arange(15).reshape(3,5)
	output:array([[ 0,  1,  2,  3,  4],
       			   [ 5,  6,  7,  8,  9],
       			   [10, 11, 12, 13, 14]])
    
    x1.ndim   #数组的维度
    output:1
    x2.ndim
    output:2
	
	x1.shape #返回数组形状
	output:(10,)
	x2.shape
	output:(3, 5)

	x1.size #返回数组元素个数
	output:10
	x2.size
	output:15
	

  2.数据访问

	'''初始化数组/矩阵'''
	x1 = np.arange(0,20,2)
	output:array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])
	x2 = np.arange(15).reshape(3,5)
	output:array([[ 0,  1,  2,  3,  4],
       			   [ 5,  6,  7,  8,  9],
       			   [10, 11, 12, 13, 14]])
    
    x1[0:5]  #访问从[0,5)下标的数
    output:array([0, 2, 4, 6, 8])
    
    x1[:5]  #访问从头到第五个元素的数
    output:array([0, 2, 4, 6, 8])
    
    x1[5:]  #访问从第五个到最后一个元素的数
    output:array([10, 12, 14, 16, 18])
    
    x1[::2] #从头访问到尾,每次步长为2
    output:array([ 0,  4,  8, 12, 16])
    
    x1[::-2] #步长为负数则从尾开始访问
    output:array([18, 14, 10,  6,  2])
    
	x2[:2,:3]  #对于多维数组操作类似,此例表示取出前两行的前三列的数
    output:array([[0, 1, 2],
       			  [5, 6, 7]])
    
    x2[0,:]  #取出第0行的数据
    output:array([0, 1, 2, 3, 4])
    
    x2[:,0] #取出第0列的数据
    output:array([ 0,  5, 10])
    

  说明:如果通过此方式将访问的对象赋值给另一个数组时,改变其值,同样会造成原数组值的改变,反之亦然。要想使该数据和原来数组数据无关,则需要采用copy()方法,例:X2 = x2[0 , : ].copy()。

  3.reshape

	'''初始化数组/矩阵'''
	x1 = np.arange(0,20,2)
	output:array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])
	
	x1.reshape(2,5)  #将其变成2维矩阵,但此时不会改变x1原来的形状
	output:array([[ 0,  2,  4,  6,  8],
      			  [10, 12, 14, 16, 18]])
	
	x1.reshape(1,10)  #此时将一维向量修改为二维的矩阵
	output:array([[ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18]])

	x1.reshape(5,-1)  #传入-1,系统会自动进行计算该维度有多少值
	output:array([[ 0,  2],
       			  [ 4,  6],
       			  [ 8, 10],
       			  [12, 14],
       			  [16, 18]])

  4.合并操作

	'''初始化数组/矩阵'''
	x = np.array([1,2,3])
	y = np.array([3,2,1])
	z = np.array([2,3,1])
	A = np.arange(1,7).reshape(2,3)
	outputA:array([[1, 2, 3],
       			   [4, 5, 6]])
	
	np.concatenate([x,y]) #拼接
	output:array([1, 2, 3, 3, 2, 1])
	
	np.concatenate([x,y,z])  #可以不仅仅只拼接两个向量
	output:array([1, 2, 3, 3, 2, 1, 2, 3, 1])
	
	np.concatenate([A,A],axis=1)  #沿着第1个维度方向拼接,默认axis=0(即第0个维度),且不能处理两个维度不相同的矩阵
	output:array([[1, 2, 3, 1, 2, 3],
       			  [4, 5, 6, 4, 5, 6]])
    
    np.vstack([A,x])   #同样也可以利用vstack处理不同维度拼接的问题,此时会自动在垂直方向进行拼接
    output:array([[1, 2, 3],
       			  [4, 5, 6],
       			  [1, 2, 3]])
    np.hstack([A,x[:2].reshape(2,1)])
    output:array([[1, 2, 3, 1],
       			  [4, 5, 6, 2]])
    '''注意:传入的数据不能非法
       例如:np.hstack([A,x[:2]]),此时传入的向量,在该维
       度下大小不一致,导致无法进行运算'''
       

  5.分割操作

	'''初始化数组/矩阵'''
	x = np.arange(10)
	output:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
	A = np.arange(16).reshape(4,4)
	output:array([[ 0,  1,  2,  3],
     			  [ 4,  5,  6,  7],
       			  [ 8,  9, 10, 11],
       			  [12, 13, 14, 15]])
       			  
	x1,x2,x3 = np.split(x,[3,7])  
	'''第一个参数:要分割的对象
	   第二个参数:分割点'''
	output1:[0 1 2] 
	output2:[3 4 5 6] 
	output3:[7 8 9]

	A1,A2 = np.split(A,[2],axis=1) #在第1个维度分割,默认在第0个维度分割
	output1:[[ 0  1]
 			 [ 4  5]
 			 [ 8  9]
 			 [12 13]] 
	output2:[[ 2  3]
 			 [ 6  7]
 			 [10 11]
 			 [14 15]]
	upper,lower = np.vsplit(A,[2]) #在垂直方向分割
	output_upper:[[0 1 2 3]
 				  [4 5 6 7]] 
	output_lower:[[ 8  9 10 11]
 				  [12 13 14 15]]
 	left,right = np.hsplit(A,[2]) #在水平方向分割
 	output_left:[[ 0  1]
 				 [ 4  5]
 				 [ 8  9]
 				 [12 13]] 
 	output_right:[[ 2  3]
 				  [ 6  7]
 				  [10 11]
 				  [14 15]]

(三)numpy.array中的运算

  1.Universal Functions

	'''初始化数组/矩阵'''
	X = np.arange(1,16).reshape(3,5)
	output:array([[ 1,  2,  3,  4,  5],
       			  [ 6,  7,  8,  9, 10],
       			  [11, 12, 13, 14, 15]])
    
    X+1  #加法
    output:array([[ 2,  3,  4,  5,  6],
       			  [ 7,  8,  9, 10, 11],
       			  [12, 13, 14, 15, 16]])
    
    X-1  #减法
    output:array([[ 0,  1,  2,  3,  4],
       			  [ 5,  6,  7,  8,  9],
       			  [10, 11, 12, 13, 14]])
    
    X*2   #乘法
    output:array([[ 2,  4,  6,  8, 10],
       			  [12, 14, 16, 18, 20],
       			  [22, 24, 26, 28, 30]])
    
    X / 2  #除法
    output:array([[0.5, 1. , 1.5, 2. , 2.5],
       			  [3. , 3.5, 4. , 4.5, 5. ],
       			  [5.5, 6. , 6.5, 7. , 7.5]])
       			
    X // 2 #整除
    output:array([[0, 1, 1, 2, 2],
       			  [3, 3, 4, 4, 5],
       			  [5, 6, 6, 7, 7]], dtype=int32)
    
    X % 2  #求余
    output:array([[1, 0, 1, 0, 1],
       			  [0, 1, 0, 1, 0],
       			  [1, 0, 1, 0, 1]], dtype=int32)
    
    1 / X #取倒数
    output:array([[1.        , 0.5       , 0.33333333, 0.25      , 0.2       ],
                  [0.16666667, 0.14285714, 0.125     , 0.11111111, 0.1       ],
                  [0.09090909, 0.08333333, 0.07692308, 0.07142857, 0.06666667]])

    np.abs(X)  #求绝对值
    output:array([[ 1,  2,  3,  4,  5],
       			  [ 6,  7,  8,  9, 10],
       			  [11, 12, 13, 14, 15]])
    
    np.sin(X)  #取正弦函数值,同样的有np.cos(),np.tan()
    output:array([[ 0.84147098,  0.90929743,  0.14112001, -0.7568025 , -0.95892427],
                  [-0.2794155 ,  0.6569866 ,  0.98935825,  0.41211849, -0.54402111],
                  [-0.99999021, -0.53657292,  0.42016704,  0.99060736,  0.65028784]])
    
    np.exp(X)  #取e的X次方
    output:array([[2.71828183e+00, 7.38905610e+00, 2.00855369e+01, 5.45981500e+01,1.48413159e+02],
                  [4.03428793e+02, 1.09663316e+03, 2.98095799e+03, 8.10308393e+03,2.20264658e+04],
                  [5.98741417e+04, 1.62754791e+05, 4.42413392e+05, 1.20260428e+06,3.26901737e+06]])
    
    np.power(3,X) #取3的X次方
    output:array([[       3,        9,       27,       81,   243],
                  [     729,     2187,     6561,    19683,    59049],
                  [  177147,   531441,  1594323,  4782969, 14348907]], dtype=int32)
           
    np.log2(X)   #取以2为底X的log值,默认取以e为底的对数值
    output:array([[0.        , 1.        , 1.5849625 , 2.        , 2.32192809],
                  [2.5849625 , 2.80735492, 3.        , 3.169925  , 3.32192809],
                  [3.45943162, 3.5849625 , 3.70043972, 3.80735492, 3.9068906 ]])
       

  2.矩阵运算

	'''初始化数组/矩阵'''
	A = np.arange(4).reshape(2,2)
	B = np.full((2,2),1)
	outputA:[[0 1]
			 [2 3]] 
	outputB:[[1 1]
 			 [1 1]]
 	
 	A+B #矩阵之间的加法(对应元素相加) 同类型的还有A-B A*B等
 	output:array([[1, 2],
       			  [3, 4]])

	A.dot(B)  #数学定义上的矩阵乘法
	output:array([[1, 1],
       			  [5, 5]])

	A.T   #求转置矩阵
	output:array([[0, 2],
       			  [1, 3]])
       			

  3.矩阵的逆

	'''初始化数组/矩阵'''
	A = np.arange(4).reshape(2,2)
	outputA:[[0 1]
			 [2 3]]
	A2 = np.arange(15).reshape(3,5)
	outputA2:array([[ 0,  1,  2,  3,  4],
       				[ 5,  6,  7,  8,  9],
       				[10, 11, 12, 13, 14]])
	
	np.linalg.inv(A)  #求A矩阵的逆矩阵
	output:array([[-1.5,  0.5],
	       		   [ 1. ,  0. ]])
	       			
	pinvX = np.linalg.pinv(A2)  #对于非方阵,可以对其求伪逆矩阵
	output:array([[-2.26666667e-01, -6.66666667e-02,  9.33333333e-02],
                  [-1.23333333e-01, -3.33333333e-02,  5.66666667e-02],
       			  [-2.00000000e-02, -1.02282287e-17,  2.00000000e-02],
       			  [ 8.33333333e-02,  3.33333333e-02, -1.66666667e-02],
       			  [ 1.86666667e-01,  6.66666667e-02, -5.33333333e-02]])
       

(四)聚合操作

	'''为了便于理解,以例子的方式进行讲解'''
	L = np.arange(15).reshape(5,3)
	output:array([[ 0,  1,  2],
       			  [ 3,  4,  5],
       			  [ 6,  7,  8],
       			  [ 9, 10, 11],
       			  [12, 13, 14]])
       			
  	sum1 = np.sum(L)   #求和
	sum2 = np.sum(L,axis=0) #沿着第0个维度进行和运算
	output1:105
	output2:[30 35 40]
	
	min_L = np.min(L)   #求最小值
	max_L = np.max(L)   #求最大值
	output1:0
	output2:14

	np.prod(L)   #对L中每个元素进行相乘
	output:0

	np.mean(L)  #求平均值
	output:7.0
	
	np.median(L) #求中位数
	output:7.0
	
	for percent in [0,25,50,100]:
    	print(np.percentile(L,q=percent))
    output:0.0
    	   3.5
    	   7.0
    	   14.0
   	'''第一个参数:传入的数组,
   	   第二个参数:百分之多少的数小于等于该值'''
   	
   	np.val(L)	#求方差
   	output:18.666666666666668
   	
	np.std(L)	#求标准差
	output:4.320493798938574
   	   

(五)索引

	'''为了便于理解,以例子的方式进行讲解'''
	L = np.random.randint(15,size=(10,))   #注意,若此时size为(10,1),则该数组为二维
	output:array([8, 1, 9, 5, 4, 9, 8, 8, 4, 8])
	
	max_X = np.max(L)
	max_argX = np.argmax(L)  #返回最大值的索引,对最小值同理
	output1:9
	output2:2
	
	L1 = np.sort(L)
	L2 = np.argsort(L)   #返回排序值的索引
	output1:[1 4 4 5 8 8 8 8 9 9] 
	output2:[1 4 8 3 0 6 7 9 2 5]
	
发布了32 篇原创文章 · 获赞 62 · 访问量 1340

猜你喜欢

转载自blog.csdn.net/Mingw_/article/details/104626969