美文网首页
numpy学习

numpy学习

作者: 自学java的菜鸟小赵 | 来源:发表于2020-09-24 22:07 被阅读0次

    私聊做毕设或者实验课题。

    1.介绍

    NumPy(Numerical Python)是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix)),支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库

    2.基本使用

    1.首先需要导入numpy包,使用pip install numpy下载安装包,使用dtype转化数据类型

    import numpy as np
    import random
    #数组类型
    array = np.array([1, 2, 3])
    print(array)
    print(type(array))
    
    array2 = np.array(range(10))
    print(array2)
    
    t3=np.arange(10)
    print(t3)
    
    t4=np.arange(4,8,2)
    print(t4)
    
    #numpy里面的数据类型
    t5=np.array(range(1,4),dtype="float32")
    print(t5)
    print(t5.dtype)
    
    t6=np.array([0,1,0,1],dtype="bool")
    print(t6)
    print(t6.dtype)
    
    #调整数据类型
    t7=t6.astype("i8")
    print(t7)
    print(t7.dtype)
    
    #numpy中的小数
    t8=np.array([random.random() for i in range(10)])
    print(t8)
    print(t8.dtype)
    
    t9 = np.round(t8, 2)
    print(t9)
    

    输出

    [1 2 3]
    <class 'numpy.ndarray'>
    [0 1 2 3 4 5 6 7 8 9]
    [0 1 2 3 4 5 6 7 8 9]
    [4 6]
    [1. 2. 3.]
    float32
    [False  True False  True]
    bool
    [0 1 0 1]
    int64
    [0.81783996 0.4754238  0.62353824 0.26188562 0.64390433 0.44740063
     0.36523649 0.96967843 0.73645357 0.34591022]
    float64
    [0.82 0.48 0.62 0.26 0.64 0.45 0.37 0.97 0.74 0.35]
    

    2.shape返回的是一个元组类型,分别代表行和列。 reshape修改数据的维度,flatten将二维数组转变成一维数组

    import numpy as np
    
    t1=np.arange(12)
    print(t1.dtype)
    print('t1->****',t1.shape)
    
    #生成多个一维数组
    t2=np.array([[1,2,3],[4,5,6]])
    print('t2->*****',t2)
    #2代表行,3代表列
    print('t2.shape->*****',t2.shape)
    
    #修改一维数组变成2维数组
    print('t1.reshape->*****',t1.reshape(3,4))
    
    t3=np.arange(24).reshape(2,3,4)
    print('t3->*****',t3)
    
    print('t3.reshape->*****',t3.reshape(4,6))
    
    
    t4=t2.reshape(6,)
    print('t4->*****',t4)
    #将二维数组变成一维数组
    t5=t2.reshape((t2.shape[0]*t2.shape[1]))
    print('t5->*****',t5)
    
    #flatten也是将二维数组变成一维数组
    t6=t2.flatten()
    print('t6->*****',t6)
    

    输出

    int32
    t1->**** (12,)
    t2->***** [[1 2 3]
     [4 5 6]]
    t2.shape->***** (2, 3)
    t1.reshape->***** [[ 0  1  2  3]
     [ 4  5  6  7]
     [ 8  9 10 11]]
    t3->***** [[[ 0  1  2  3]
      [ 4  5  6  7]
      [ 8  9 10 11]]
    
     [[12 13 14 15]
      [16 17 18 19]
      [20 21 22 23]]]
    t3.reshape->***** [[ 0  1  2  3  4  5]
     [ 6  7  8  9 10 11]
     [12 13 14 15 16 17]
     [18 19 20 21 22 23]]
    t4->***** [1 2 3 4 5 6]
    t5->***** [1 2 3 4 5 6]
    t6->***** [1 2 3 4 5 6]
    
    

    3.数组的计算

    import numpy as np
    t1=np.arange(24).reshape(4,6)
    print(t1)
    print("---*******************-------")
    print(t1+2)
    print("---*******************-------")
    print(t1*2)
    print("---*******************-------")
    print(t1/2)
    print("---*******************-------")
    print(t1/0)
    print("---*******************-------")
    t2=np.arange(100,124).reshape(4,6)
    print(t2)
    print("---*******************-------")
    print(t1+t2)
    print("---*******************-------")
    print(t1*t2)
    print("---*******************-------")
    t3=np.arange(0,6)
    print(t3)
    print(t1-t3)
    print("---*******************-------")
    t4=np.arange(4).reshape(4,1)
    print(t4)
    print(t1-t4)
    

    输出

    [[ 0  1  2  3  4  5]
     [ 6  7  8  9 10 11]
     [12 13 14 15 16 17]
     [18 19 20 21 22 23]]
    ---*******************-------
    [[ 2  3  4  5  6  7]
     [ 8  9 10 11 12 13]
     [14 15 16 17 18 19]
     [20 21 22 23 24 25]]
    ---*******************-------
    [[ 0  2  4  6  8 10]
     [12 14 16 18 20 22]
     [24 26 28 30 32 34]
     [36 38 40 42 44 46]]
    ---*******************-------
    [[ 0.   0.5  1.   1.5  2.   2.5]
     [ 3.   3.5  4.   4.5  5.   5.5]
     [ 6.   6.5  7.   7.5  8.   8.5]
     [ 9.   9.5 10.  10.5 11.  11.5]]
    ---*******************-------
    [[nan inf inf inf inf inf]
     [inf inf inf inf inf inf]
     [inf inf inf inf inf inf]
     [inf inf inf inf inf inf]]
    ---*******************-------
    [[100 101 102 103 104 105]
     [106 107 108 109 110 111]
     [112 113 114 115 116 117]
     [118 119 120 121 122 123]]
    ---*******************-------
    [[100 102 104 106 108 110]
     [112 114 116 118 120 122]
     [124 126 128 130 132 134]
     [136 138 140 142 144 146]]
    ---*******************-------
    [[   0  101  204  309  416  525]
     [ 636  749  864  981 1100 1221]
     [1344 1469 1596 1725 1856 1989]
     [2124 2261 2400 2541 2684 2829]]
    ---*******************-------
    [0 1 2 3 4 5]
    [[ 0  0  0  0  0  0]
     [ 6  6  6  6  6  6]
     [12 12 12 12 12 12]
     [18 18 18 18 18 18]]
    ---*******************-------
    [[0]
     [1]
     [2]
     [3]]
    [[ 0  1  2  3  4  5]
     [ 5  6  7  8  9 10]
     [10 11 12 13 14 15]
     [15 16 17 18 19 20]]
    

    4.读取外部数据,delimiter=','指明分割符,dtype,指明数据类型,unpack数据转置,还可以使用transpose(),T(),swapaxes()方法进行转置

    import numpy as np
    path = './num.txt'
    data1 = np.genfromtxt(path,delimiter=',',dtype=int)
    data2 = np.genfromtxt(path,delimiter=',',dtype=int,unpack=True)
    print(data1)
    print(data2)
    
    print(np.shape(data1)[0])
    #转置,也可以data1.T
    print(data1.transpose())
    #转置,将0轴和1轴进行转化
    print((data1.swapaxes(1,0)))
    

    输出

    [[23  4  5  5]
     [45 23 23 12]
     [12  3  4  1]]
    [[23 45 12]
     [ 4 23  3]
     [ 5 23  4]
     [ 5 12  1]]
    3
    [[23 45 12]
     [ 4 23  3]
     [ 5 23  4]
     [ 5 12  1]]
    [[23 45 12]
     [ 4 23  3]
     [ 5 23  4]
     [ 5 12  1]]
    

    5.索引和切片

    import  numpy as np
    
    data=np.arange(24).reshape(4,6)
    
    print(data)
    print("*"*100)
    #取行
    print(data[2])
    #取联系多行
    print(data[2:])
    
    print(data[[0,2,3]])
    print("*"*100)
    #取列
    print(data[1,:])
    print(data[2:,0])
    print(data[2:,[0,1]])
    print(data[2:,1:])
    print("*"*100)
    #取不相邻的点 代表坐标(0,0),(1,1),(2,2)这个点
    print(data[[0,1,2],[0,1,2]])
    

    输出

    [[ 0  1  2  3  4  5]
     [ 6  7  8  9 10 11]
     [12 13 14 15 16 17]
     [18 19 20 21 22 23]]
    ****************************************************************************************************
    [12 13 14 15 16 17]
    [[12 13 14 15 16 17]
     [18 19 20 21 22 23]]
    [[ 0  1  2  3  4  5]
     [12 13 14 15 16 17]
     [18 19 20 21 22 23]]
    ****************************************************************************************************
    [ 6  7  8  9 10 11]
    [12 18]
    [[12 13]
     [18 19]]
    [[13 14 15 16 17]
     [19 20 21 22 23]]
    ****************************************************************************************************
    [ 0  7 14]
    

    6.更多索引操作

    import  numpy as np
    
    data=np.arange(24).reshape(4,6)
    print(data)
    print(data[2:,1:])
    print(data<10)
    data[data<10]=3
    print(data)
    
    data2 = np.where(data<10,0,10)  #if data<10 则赋予10,反之赋予10
    print(data2)
    print("*"*100)
    data3=np.arange(24).reshape(4,6)
    data4=data3.clip(10,18) #小于10的替换成10,大于18的替换成18
    print(data4)
    

    输出

    [[ 0  1  2  3  4  5]
     [ 6  7  8  9 10 11]
     [12 13 14 15 16 17]
     [18 19 20 21 22 23]]
    [[13 14 15 16 17]
     [19 20 21 22 23]]
    [[ True  True  True  True  True  True]
     [ True  True  True  True False False]
     [False False False False False False]
     [False False False False False False]]
    [[ 3  3  3  3  3  3]
     [ 3  3  3  3 10 11]
     [12 13 14 15 16 17]
     [18 19 20 21 22 23]]
    [[ 0  0  0  0  0  0]
     [ 0  0  0  0 10 10]
     [10 10 10 10 10 10]
     [10 10 10 10 10 10]]
    ****************************************************************************************************
    [[10 10 10 10 10 10]
     [10 10 10 10 10 11]
     [12 13 14 15 16 17]
     [18 18 18 18 18 18]]
    

    7.数组的拼接

    import numpy as np
    
    data1=np.arange(0,12).reshape(2,6)
    print(data1)
    data2=np.arange(12,24).reshape(2,6)
    print(data2)
    #竖直拼接
    vstack= np.vstack((data1, data2))
    print(vstack)
    #水平拼接
    hstack = np.hstack((data1, data2))
    print(hstack)
    
    
    #数组的行列交换
    vstack[[1,2],:]= vstack[[2,1],:]
    print(vstack)
    
    #数组的列交换
    vstack[:,[1,2]]=vstack[:,[2,1]]
    print(vstack)
    

    输出

    [[ 0  1  2  3  4  5]
     [ 6  7  8  9 10 11]]
    ****************************************************************************************************
    [[12 13 14 15 16 17]
     [18 19 20 21 22 23]]
    ****************************************************************************************************
    [[ 0  1  2  3  4  5]
     [ 6  7  8  9 10 11]
     [12 13 14 15 16 17]
     [18 19 20 21 22 23]]
    ****************************************************************************************************
    [[ 0  1  2  3  4  5 12 13 14 15 16 17]
     [ 6  7  8  9 10 11 18 19 20 21 22 23]]
    ****************************************************************************************************
    [[ 0  1  2  3  4  5]
     [12 13 14 15 16 17]
     [ 6  7  8  9 10 11]
     [18 19 20 21 22 23]]
    ****************************************************************************************************
    [[ 0  2  1  3  4  5]
     [12 14 13 15 16 17]
     [ 6  8  7  9 10 11]
     [18 20 19 21 22 23]]
    

    8.zeros和ones

    import numpy as np
    
    data1=np.arange(0,12).reshape(2,6)
    data2=np.arange(12,24).reshape(2,6)
    
    ze=np.zeros((data1.shape[0],1)).astype(int)
    one=np.ones((data2.shape[0],1)).astype(int)
    
    
    hstack1= np.hstack((data1, ze))
    hstack2=np.hstack((data2,one))
    
    final_stack=np.vstack((hstack1,hstack2))
    print(final_stack)
    

    输出

    [[ 0  1  2  3  4  5  0]
     [ 6  7  8  9 10 11  0]
     [12 13 14 15 16 17  1]
     [18 19 20 21 22 23  1]]
    

    9.eye,argmax,argmin

    import numpy as np
    
    data=np.arange(0,24).reshape(4,6)
    
    #其他方法
    #创建一个全为0的数组
    zeros= np.zeros((3,3), dtype=int)
    print(zeros)
    #创建一个全为1的数组
    ones = np.ones((3, 3), dtype=int)
    print(ones)
    
    #生成一个对角线为1的方正
    eye= np.eye(3,dtype=int)
    print(eye)
    
    #获取最大值的位置 axios=0代表竖轴,axios=1代表的是横轴
    argmax = np.argmax(data, axis=0)
    print(argmax)
    #获取最小值的位置
    eye[eye==1]=-1
    print(eye)
    
    argmin=np.argmin(data,axis=0)
    print(argmin )
    

    输出

    [[0 0 0]
    [0 0 0]
    [0 0 0]]
    [[1 1 1]
    [1 1 1]
    [1 1 1]]
    [[1 0 0]
    [0 1 0]
    [0 0 1]]
    [3 3 3 3 3 3]
    [[-1  0  0]
    [ 0 -1  0]
    [ 0  0 -1]]
    [0 0 0 0 0 0]
    

    10.随机数种子

    import numpy as np
    #指明一个随机数种子,这里如果指明seed=n,则下面跟seed=n的数组产生的随机数是相同的
    np.random.seed(3)
    randint = np.random.randint(10, 20, (4, 5))
    print(randint)
    
    np.random.seed(3)
    randint2 = np.random.randint(10, 20, (4, 5))
    print(randint2)
    

    输出

    [[18 19 13 18 18]
     [10 15 13 19 19]
     [15 17 16 10 14]
     [17 18 11 16 12]]
    [[18 19 13 18 18]
     [10 15 13 19 19]
     [15 17 16 10 14]
     [17 18 11 16 12]]
    

    11.isnan

    import numpy as np
    
    
    def final_num(t1):
        for i in range(t1.shape[1]):
            #得到每一列
           temp_col=t1[:,i]
            #计算数组中nan的数目
           nan_num = np.count_nonzero(np.isnan(temp_col))
           if nan_num !=0:
               #因为连个nan等于false,所以这里统计每一列不为nan的数
               temp=temp_col[temp_col == temp_col]
               #将均值赋值给为nan的数据
               temp_col[np.isnan(temp_col)] = temp.mean()
        return t1
    
    if __name__ == '__main__':
        t1 = np.arange(12).reshape(3, 4).astype("float")
        t1[1, 2:] = np.nan
        print(t1[t1==t1])
        print("*"*100)
        print(final_num(t1))
    

    输出

    [ 0.  1.  2.  3.  4.  5.  8.  9. 10. 11.]
    ****************************************************************************************************
    [[ 0.  1.  2.  3.]
     [ 4.  5.  6.  7.]
     [ 8.  9. 10. 11.]]
    

    常用的统计函数

    求和: t.sum(asix=None)
    均值: t.mean(a,asix=None)
    中值: np.median(asix=None)
    最大值: t.max(asix=None)
    最小值: t.min(asix=None)
    极值: t.ptp(t,asix=None)
    标准差: t.sttd(asix=None)

    Pandas 处理非数值型的数据

    • Series 一维,带标签的数组
    • DataFrame 二维,Series容器

    1.Series的初步了解

    import pandas as pd
    
    ser=pd.Series([1,2,3,4,5,6],index=list("abcdef"))
    print(ser)
    print("*"*100)
    temp_dict={'name':'xiaozhao','age':30,"tel":100}
    series = pd.Series(temp_dict)
    print(series)
    print("*"*100)
    print(series['age'])
    print(series[0])
    print("*"*100)
    print(series[['age','tel']])
    print("*"*100)
    print(list(series.index))
    print(series.values)
    

    输出

    a    1
    b    2
    c    3
    d    4
    e    5
    f    6
    dtype: int64
    ****************************************************************************************************
    name    xiaozhao
    age           30
    tel          100
    dtype: object
    ****************************************************************************************************
    30
    xiaozhao
    ****************************************************************************************************
    age     30
    tel    100
    dtype: object
    ****************************************************************************************************
    ['name', 'age', 'tel']
    ['xiaozhao' 30 100]
    
    

    2.读取外部数据并连接数据库

    '''都取外部数据'''
    import pandas as pd
    import pymysql
    
    df= pd.read_csv("dog.txt")
    print(df)
    
    conn = pymysql.connect(host='localhost', port=3306,
                               user='root', password='123',
                               db='db01', charset='utf8',cursorclass=pymysql.cursors.DictCursor)
    str='select * from dept'
    db=pd.read_sql(str,conn)
    print(db)
    

    输出

         名字  年龄
    0  aaa   11
    1  bbb   12
    2  ccc   13
       deptno dname db_source
    0       1   开发部      db01
    1       2   研发部      db01
    2       3   生产部      db01
    3       4   技术部      db01
    

    3.更多操作

    import pandas as pd
    import numpy as np
    
    data = pd.DataFrame(np.arange(12).reshape(3,4),index=list("123"),columns=list("abcd"))
    print(data.head(1))
    print(data.info) #z展示dataForm里面的数据信息
    print(data.describe()) #展示数据的统计信息
    print(data.sort_values(by='c',ascending=False)) #by通过哪个属性进行排序,ascending=True,表示升序
    print("*"*100)
    print(data.loc['1']['a']) #根据标签索引获取数据
    print(data.iloc[1][2]) #根据位置获取数据,这里是第2行第3列,所以显示6
    print("*"*100)
    #读取一行
    print(data[:1])
    #读取多行
    print(data.iloc[[1,2]])
    #读取多列
    print(data[['a','b']])
    print(np.array(data[1:]).flatten())
    data.loc[4]=[1,2,3,4]
    print('增加行\n',data)
    data['e']=[1,2,3,4]
    print('增加列\n',data)
    print("*"*100)
    #读取列,可以直接指明列的索引值
    print(data['b'])
    print("*"*100)
    print(data[1:]['c'])
    print('data.index->******',list(data.index))
    print("*"*100)
    data2=[{"name":'zhangsan','age':12},{'age':12,'tel':113},{"name":'zhangsan','age':12,'tel':113}]
    data2_dataframe=pd.DataFrame(data2)
    print(data2_dataframe)
    
    print("*"*100)
    mean = data2_dataframe['tel'].mean()
    print(mean)
    #这里mean如果不知名列会自动计算当前数据列的平均值,也可以指明列名如data2_dataframe['tel'].mean()
    data2_dataframe=data2_dataframe.fillna(data2_dataframe.mean())
    print(data2_dataframe)
    
    
    print("*"*100)
    data3=[[1,2,3],[4,5,6],[1,2,3],[2,3,4]]
    data4=np.array(data3)
    print(type(data4))
    array = np.array(data3).flatten()
    print(set(array))
    

    输出

      a  b  c  d
    1  0  1  2  3
    <bound method DataFrame.info of    a  b   c   d
    1  0  1   2   3
    2  4  5   6   7
    3  8  9  10  11>
             a    b     c     d
    count  3.0  3.0   3.0   3.0
    mean   4.0  5.0   6.0   7.0
    std    4.0  4.0   4.0   4.0
    min    0.0  1.0   2.0   3.0
    25%    2.0  3.0   4.0   5.0
    50%    4.0  5.0   6.0   7.0
    75%    6.0  7.0   8.0   9.0
    max    8.0  9.0  10.0  11.0
       a  b   c   d
    3  8  9  10  11
    2  4  5   6   7
    1  0  1   2   3
    ****************************************************************************************************
    0
    6
    ****************************************************************************************************
       a  b  c  d
    1  0  1  2  3
       a  b   c   d
    2  4  5   6   7
    3  8  9  10  11
       a  b
    1  0  1
    2  4  5
    3  8  9
    [ 4  5  6  7  8  9 10 11]
    增加行
        a  b   c   d
    1  0  1   2   3
    2  4  5   6   7
    3  8  9  10  11
    4  1  2   3   4
    增加列
        a  b   c   d  e
    1  0  1   2   3  1
    2  4  5   6   7  2
    3  8  9  10  11  3
    4  1  2   3   4  4
    ****************************************************************************************************
    1    1
    2    5
    3    9
    4    2
    Name: b, dtype: int64
    ****************************************************************************************************
    2     6
    3    10
    4     3
    Name: c, dtype: int64
    data.index->****** ['1', '2', '3', 4]
    ****************************************************************************************************
           name  age    tel
    0  zhangsan   12    NaN
    1       NaN   12  113.0
    2  zhangsan   12  113.0
    ****************************************************************************************************
    113.0
           name  age    tel
    0  zhangsan   12  113.0
    1       NaN   12  113.0
    2  zhangsan   12  113.0
    ****************************************************************************************************
    <class 'numpy.ndarray'>
    {1, 2, 3, 4, 5, 6}
    
    
    

    相关文章

      网友评论

          本文标题:numpy学习

          本文链接:https://www.haomeiwen.com/subject/ufmtuktx.html