python与数据挖掘算法

(01)numpy学习

2020-05-09  本文已影响0人  nono辉

创建数组对象

axis为轴,n维数组有n个轴,axis的取值为1,2,3,4...,n

1、数组属性

      属性                     说明         
     ndim                 表示数组的维度       
     shape             表示数组的尺寸,(n,m)    
     size                返回数组的元素总数      
     dtype               描述数组中元素的类型     
   itemsize         表示数组的每个元素的大小(以字节为单位)

arr.astype('数组类型') 转换数组类型
arr.astype(np.数组类型) 转换数组类型

2、数组创建

array

numpy.array(object,dtype=None,copy=True,order='k',subok=False,ndmin=0)

参数名称 说明
object 接收array,表示想要创建的数组
dtype 接受data-type,表示数组所需的数据类型
ndmin 接受int,指定生成数组应该具有的最小维数

import numpy as np
arr1 = np.array([1,2,3,4]) #创建一维数组
arr2 = np.array([[1,2,3],[4,5,6],[7,8,9]]) #创建二维数组
In [6]: print('数组维度为:',arr2.shape)
数组维度为: (3, 3)
In [7]: print('数组类型为:',arr2.dtype)
数组类型为: int32
In [8]: print('数组元素个数为:',arr2.size)
数组元素个数为: 9
In [9]: print('数组元素大小为:',arr2.itemsize)
数组元素大小为: 4

一维数组的创建

arange

In [10]: np.arange(0,1,0.1)
Out[10]: array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])

linspace

#创建等差数列,包含终点值
In [14]: np.linspace(0,1,5,endpoint=True, retstep=False, dtype=None)
Out[14]: array([0.  , 0.25, 0.5 , 0.75, 1.  ])

logspace

#创建等比数列,生成5个10^0~10^2等比数
In [18]: np.logspace(0,2,5)
Out[18]:
array([  1.        ,   3.16227766,  10.        ,  31.6227766 ,
       100.        ])

zeros,eye,diag,ones

#创建特殊矩阵
np.zeros((2,3))  #2行3列的0矩阵
np.eye(3)        #3行3列的单位矩阵
np.diag([1,2,3,4])   #生成对角矩阵  
np.ones((5,3))   #5行3列的1矩阵

3、数组数据类型

可用于作数据预处理

    类型              描述    
   bool            布尔型    
   inti         由所在平台决定其精度

int8(16、32、64) 整型
uint8(16、32、64) 无符号整型
float(16、32、64) 浮点数
complex(64、128) 复数

4、生成随机数组

                 函数                                 描述            
        np.random.random(n)                    n个随机数构成的一维数组       
        np.random.rand(n,m)                   服从均匀分布的n行m列矩阵       
        np.random.randn(n,m)                  服从正态分布的n行m列矩阵       

np.random.randint(low,high=None,size=None) 数组尺寸为size,元素范围在low~high的矩阵

常用随机数生成函数

  函数               描述        
 seed             随机数种子      

permutation 返回序列的一个随机排列或范围
Shuffle 对序列进行随机排序
binomial 产生二项分布的随机数
normal 产生正态分布的随机数
beta 产生beta分布的随机数
chisquare 产生卡方分布的随机数
gamma 产生gamma分布的随机数
uniform 产生在[0,1]中均匀分布的随机数

5、数组索引

一维数组

arry[n :m :h] #从n~m-1以h为步长

二维数组

arry[row,col] #row为行,col为列

arry[[(0,1,2),(1,2,3)]] #索引对应行对应列的元素

arry[1:,(0,2,3)] #索引2、3行对应的023列元素

6、变换数组的形态

改变数组形状

arr = np.arange(12)  #创建一维数组
arr1 = arr.reshapde(3,4)
arr2 = arr1*3
arr3 = np.arange(16).reshape(4,4)

              函数                              描述           
       arr.reshape(n,m)              将一维数组变成n行m列数组,不改变原有数组 
 arr1.ravel()、arr1.flatten()                横向展平数组         
      arr1.flatten('F')                     纵向展平数组         
    np.hstack((arr1,arr2))                 两个数组横向组合        
    np.vstack((arr1,arr2))                 两个数组纵向组合        

np.concatenate((arr1,arr2),axis=1) axis为1时横向组合,axis为0时纵向组合
np.hsplit(arr3,2) 横向分割arr3,左右分开
np.vsplit(arr3,2) 纵向分割arr3,上下分开
np.split(arr3,2,axis=1) axis为1时横向分割,axis为0时纵向分割
arr.shape=(m,n) 将数组arr变为(m,n)的数组,改变原有数组

数据的分裂

1、np.split()

  1. 如果indices_or_sections是一个整数N,则数组将被分割沿着'轴'进入N个相等的数组
       #如果indices_or_sections是一个整数N,则数组将被分割沿着'轴'进入N个相等的数组
       import numpy as np
       a=np.ones((2,2),dtype='int')
       b=np.zeros((2,2),dtype='int')
       c=np.concatenate([a,b],axis=0)
       c
       np.split(c,2,axis=0)  #返回的对象其实是子阵列表
       #返回的对象其实是子阵列表,因此是可以进行索引操作的
       np.split(c,2,axis=0)[0]
  1. 如果indices_or_sections是排序整数的1-D数组,则为条目指示数组被分割的“轴”的位置。
       #如果indices_or_sections是排序整数的1-D数组,则为条目指示数组被分割的“轴”的位置。 
       d=np.array([[1, 1],
                   [1, 1],
                   [2, 2],
                   [2, 2],
                   [3, 3],
                   [3, 3],
                   [4, 4],
                   [4, 4]]) 
       np.split(d,[5],axis=0)
       #将数组切分成三份(两到三段)
       np.split(d,[3,6],axis=0)  #注意这里不要写切片的冒号
       #将数组切分成四份(三刀四段)
       np.split(d,[2,4,6],axis=0)  

2、np.vsplit()

3、np.hsplit()

7、复制和视图

简单赋值

简单赋值不会创建数组对象或其数据的拷贝。

In [8]: a = np.arange(6)

In [9]: b = a

In [10]: id(a),id(b)
Out[10]: (2562742930128, 2562742930128)

视图

a.view()

    In [14]: a = np.arange(0, 12, 1).reshape(6, 2)^M
        ...: c = a.view()
    
    In [15]: id(a),id(c)
    Out[15]: (2562742848848, 2562743600592)

新数组数据更改后,会影响原始数据。类似于原生python中的浅复制:

In [16]: a[0,1]=11^M
    ...: ^M
    ...: a^M
    ...: c  #c = a.view()
Out[16]:
array([[ 0, 11],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11]])

数组副本

也可以通过.copy()方法创建一个副本,类似于原生python的深复制。

    import numpy
    a = np.random.randint(2, size=(3, 4)) # 二维数组
    b = a.copy()
    a
    b
    id(a),id(b)
    a[0, 0]= 8888
    a
    b

Numpy矩阵与通用函数

1、创建Numpy矩阵

               函数                     描述  
  np.mat('1 2 3;4 5 6;7 8 9')        创建矩阵 

np.matrix([[1,2,3],[4,5,6],[7,8,9]]) 创建矩阵
np.bmat('arr1 arr2;arr2 arr1') 分块矩阵组合

矩阵运算

    import numpy as np
    matr1 = np.mat('1 2 3;4 5 6; 7 8 9')
    matr2 = matr1*3  #矩阵与数相乘
    matr1+matr2           矩阵相加  
    matr1-matr2           矩阵相减  
    matr1*matr2           矩阵相乘  

np.multiply(matr1,matr2) 矩阵对应元素相乘

    c = np.array( [[1,1], [0,1]] )
    d = np.array( [[2,0], [3,4]] )
    c.dot(d)  
    np.dot(c,d)
    array([[5, 4],
           [3, 4]])

矩阵特有属性

属性 说明
T 返回自身的转置
H 返回自身的共轭转置
I 返回自身的逆矩阵
A 返回自身数据的二维数组的视图

    matr1 = np.mat("1 2 3;4 5 6;7 8 9")
    In [15]: matr1.T
    Out[15]:
    matrix([[1, 4, 7],
            [2, 5, 8],
            [3, 6, 9]])

2、ufunc(通用)函数

常用的ufunc函数运算

基本函数运算

通用函数广播机制

广播指不同形状的数组之间执行算术运算的方式。(一维数组加二维数组)

    In [1]: import numpy as np
    In [2]: arr1 = np.array([[0,0,0],[1,1,1],[2,2,2],[3,3,3]])
    In [3]: arr2 = np.array([1,2,3])
    In [4]: arr1+arr2
    Out[4]:
    array([[1, 2, 3],
           [2, 3, 4],
           [3, 4, 5],
           [4, 5, 6]])
    In [18]: arr1 = np.array([[0,0,0],[1,1,1],[2,2,2],[3,3,3]])
    In [19]: arr3 = np.array([1,2,3,4]).reshape((4,1))
    In [20]: arr1+arr3
    Out[20]:
    array([[1, 1, 1],
           [3, 3, 3],
           [5, 5, 5],
           [7, 7, 7]])

广播规则

规则1:如果两个数组的维度数不相同,那么小维度数组的形状将会补齐

    import numpy as np
    np.ones((3,3))+np.arange(3)
    np.ones((3,3))+np.ones((3,1))
    np.ones((3,3))+np.ones((2,3))##会报错

规则2:如果两个数组的形状在任何一个维度都不匹配,数组的形状会沿着维度为1的维度扩展,以匹配另外一个数组形状。

    np.arange(3).reshape(3,1)+np.arange(3)

规则3:如果两个数组的形状在任何一个维度上都不匹配并且没有任何一个维度等于1,会广播错误。

    ##会报错
    np.arange(3).reshape(3,2)
    np.arange(3)
    
    np.arange(3).reshape(3,2)+np.arange(3)

函数的向量化

1、frompyfunc 函数

frompyfunc(func,nin,nout)

2、vectorize 函数

np.vectorize(['pyfunc','otypes = None')
    def fun(x,y):
        if x>y:
            return 1
        else:
            return 2
    a=np.array([1,12,5,6,7,9])
    b=np.array([5,6,7,8,9,12])
    fun_array = np.vectorize(fun,otypes=[float])       #这里只是将上一节的np.frompyfunc改成np.vectorize
    fun_array(a,b)

3、判断符

    In [3]: import numpy as np
    
    In [4]: a=np.array([1,2,3])^M
       ...: b=np.array([True,False,True])^M
       ...: ^M
       ...: a[b]
    Out[4]: array([1, 3])
        
    In [5]: np.random.seed(0)
       ...: a=np.random.randint(10,size=(3,3))
       ...: a
       ...: a>5
       ...: a[a>5]
    Out[5]: array([7, 9])

Numpy进行统计分析

1、读/写文件

文件的读/写主要有二进制的文件读/写和文件列表形式的数据读/写两种形式。

二进制文件

                 函数                         说明     

np.save(file_path,arr,allow_pickle=True,fix_imports=True) 以二进制的格式保存数据
np.savez(file_path,arr1,arr2) 多个数组存储
np.load("file_path.npy") 读取单个数组的文件
np.load("file_path.npz") 读取多个数组的文件

文本文件

                 函数                          说明     

np.savetxt(fname,X,fmt='%.18e',delimiter=' ,',mewline='\n',header='',footer='',comments='#') 保存为文本文件
np.loadtxt('file_path',delimiter=',') 读入文件
np.genfromtxt(file_path,delimiter=',') 读取,输出一组结构化数据

2、简单的统计分析

numpy的快速排序

          函数                               说明               
      arr.sort()                          直接排序              
   arr.sort(axis=1)                  1为横轴排序,0为纵轴排序          
    arr.argsort()                     返回排序后值对应的下标           
 np.lexsort((a,b,c))        a,b,c为数组,多个键值排序时,按照最后一个传入的数组进行排序
     np.unique()                           去重               
    np.tile(arr,n)                     将arr数组重复n次           

np.repeat(arr,n,axis=None) 将arr数组重复n次,axis指沿哪个轴进行重复

tile函数是对数组进行重复操作,repeat函数是对数组中的每个元素进行重复操作

    import numpy as np
    arr = np.array([2,3,6,8,0,7])
    print(arr.argsort())
    
    
    a = np.array([3,2,6,4,5])
    b = np.array([50,30,40,20,10])
    c = np.array([400,300,600,100,200])
    d = np.lexsort((a,b,c))
    print(list(zip(a[d],b[d],c[d])))
#输出结果
[4 0 1 2 5 3]
[(4, 20, 100), (5, 10, 200), (2, 30, 300), (3, 50, 400), (6, 40, 600)]

数组的交并差,唯一

     方法                       说明               
 unique(x)             计算x中的唯一元素,并返回有序结果       

intersect1d(x,y) 计算x和y的公共元素,并返回有序结果。
union1d(x,y) 计算x和y的并集,并返回有序结果。
in1d(x,y) 得到一个表示“x的元素是否包含于y”的布尔型数组。
setdiff1d(x,y) 集合的差,即元素在x中且不在y中。
setxor1d(x,y) 集合的对称性,即存在于一个数组中但不同时存在于两个数组中的元素

3、常用统计函数

np.sum(arr)           计算数组的和       

arr.sum(axis=0) 0代表沿纵轴求和,1代表沿横轴求和
np.mean(arr) 计算数组的均值
arr.mean(axis=0) 0代表沿纵轴求均值,1代表沿横轴求均值
np.std(arr) 计算数组标准差
np.var(arr) 计算数组方差
np.max(arr) 计算数组最大值
np.min(arr) 计算数组最小值
np.argmin(arr) 返回数组最小元素的索引
np.argmax(arr) 返回数组最大元素的索引
np.cumsum(arr) 计算所有元素的累计和
np.cumprod(arr) 计算所有元素的累计积

    >>> arr = np.arange(2,10)
    >>> np.cumsum(arr)
    array([ 2,  5,  9, 14, 20, 27, 35, 44], dtype=int32)
    >>> np.cumprod(arr)
    array([     2,      6,     24,    120,    720,   5040,  40320, 362880],dtype=int32)
上一篇 下一篇

猜你喜欢

热点阅读