学习代码:numpy

import random
import sys
import numpy as np
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QGroupBox, QHBoxLayout, QMenu, QDialog, \
    QLabel

class MyWin(QWidget):
    def __init__(self):
        super().__init__()
        self.setUI()

    def setUI(self):
        self.setWindowTitle('Numpy')

        self.mainLay = QVBoxLayout()
        # 第四章
        Part4_Button=QPushButton('第四章')

        Part4_Menu=QMenu()
        Creat_Array_Action=Part4_Menu.addAction('1.数组的创建')
        Creat_Array_Action.triggered.connect(self.Creat_Array)
        Operate_Array_Action=Part4_Menu.addAction("2.数组的操作")
        Operate_Array_Action.triggered.connect(self.Operate_Array)
        Array_Shape_Action=Part4_Menu.addAction("3.数组的形状")
        Array_Shape_Action.triggered.connect(self.Array_Shape)
        Array_Calulate_Action=Part4_Menu.addAction('4.数组的计算')
        Array_Calulate_Action.triggered.connect(self.Array_Calulate)

        Part4_Button.setMenu(Part4_Menu)
        self.mainLay.addWidget(Part4_Button)

        # 第五章
        Part5_Button = QPushButton('第五章')

        Part5_Menu=QMenu()
        Read_Data_Action = Part5_Menu.addAction('1.读取本地数据')
        Read_Data_Action.triggered.connect(self.Read_Data)
        Array_Transpose_Action=Part5_Menu.addAction('2.数组的转置')
        Array_Transpose_Action.triggered.connect(self.Array_Transpose)
        Array_Axis_Action=Part5_Menu.addAction('3.数组的轴')
        Array_Axis_Action.triggered.connect(self.Array_Axis)
        Array_Index_Action=Part5_Menu.addAction('4.数组的切片和索引')
        Array_Index_Action.triggered.connect(self.Array_Index)
        Numpy_Data_Change_Action=Part5_Menu.addAction('5.numpy中数组的修改')
        Numpy_Data_Change_Action.triggered.connect(self.Numpy_Data_Change)
        Numpy_Bool_Index_Action=Part5_Menu.addAction('6.numpy中布尔索引值')
        Numpy_Bool_Index_Action.triggered.connect(self.Numpy_Bool_Index)
        Numpy_Ternary_Operate_Action=Part5_Menu.addAction('7.numpy中三元运算符')
        Numpy_Ternary_Operate_Action.triggered.connect(self.Numpy_Ternary_Operate)
        Numpy_Clip_Action=Part5_Menu.addAction('8.numpy中的clip')
        Numpy_Clip_Action.triggered.connect(self.Numpy_Clip)
        Numpy_Nan_Action=Part5_Menu.addAction('9.numpy之nan')
        Numpy_Nan_Action.triggered.connect(self.Numpy_Nan)

        Part5_Button.setMenu(Part5_Menu)

        self.mainLay.addWidget(Part5_Button)

        # 第六章
        Part6_Button = QPushButton('第六章')

        Part6_Menu=QMenu()
        Array_Stack_Action = Part6_Menu.addAction('1.数组的拼接')
        Array_Stack_Action.triggered.connect(self.Array_Stack)
        Array_RouColumn_Exchange_Action=Part6_Menu.addAction('2.数组的行列交换')
        Array_RouColumn_Exchange_Action.triggered.connect(self.Array_RouColumn_Exchange)
        Numpy_Nan_Inf_Action =Part6_Menu.addAction('3.nan和inf')
        Numpy_Nan_Inf_Action.triggered.connect(self.Numpy_Nan_Inf)
        Numpy_Statistics_Function_Action=Part6_Menu.addAction('4.numpy中的常用统计函数')
        Numpy_Statistics_Function_Action.triggered.connect(self.Numpy_Statistics_Function)
        Special_Array_Action=Part6_Menu.addAction('5.3种特殊数组')
        Special_Array_Action.triggered.connect(self.Special_Array)
        Get_MaxMin_Action=Part6_Menu.addAction('5.获取行列的最大值最小值')
        Get_MaxMin_Action.triggered.connect(self.Get_MaxMin)

        Part6_Button.setMenu(Part6_Menu)

        self.mainLay.addWidget(Part6_Button)

        self.setLayout(self.mainLay)
    # 数组的创建
    def Creat_Array(self):

        # 1.np.array参数传入列表
        print('-'*10+'np.array参数传入列表')
        a=np.array([1,2,3,4,5,6])
        print(a)

        # 2.np.array参数传入range()
        print('-' * 10 + 'np.array参数传入range()')
        b=np.array(range(1,6))
        print(b)

        # 3.使用np.arange()创建数字
        print('-' * 10 + '使用np.arange()创建数字')
        c=np.arange(1,6)
        print(c)
        # 4.使用np.
        d=np.fromfunction(lambda x,y:x+y)

        '''
        数字的创建方法有3个:
            1.np.array参数传入列表
            2.np.array参数传入range()
            3.使用np.arange()创建数字,参数传入方法同range()函数
        '''
    # 数组的操作
    def Operate_Array(self):
        # 1.创建数组时,使用dtype参数指定数据类型
        print('-' * 10 + '创建数组时,使用dtype参数指定数据类型')
        a=np.array([1,2,3,4,5,6],dtype="int8")
        print(a)
        print(type(a))
        print(a.dtype)
        '''参数dtype的数据类型为'''

        # 2.使用np.astype方法修改数据类型
        print('-' * 10 + '使用np.astype方法修改数据类型')
        b=np.array([1,2,3,4,5,6])
        b.astype(np.int32)
        print(b.dtype)
        print(b)
        '''
        下面为numpy中常见的数据类型
            类型                 代码类型         说明
        int8、 uint8             i1、u1       有符号和无符号的8位(1个字节)整型
        int16、 uint16           i2、u2       有符号和无符号的16位(2个字节)整型
        int32、 uint32           i4、u4       有符号和无符号的32位(4个字节)整型
        int64、uint64            i8、u8       有符号和无符号的64位(8个字节)整型
        float16                  f2          半精度浮点数
        float32                  f4或f        标准的单精度浮点数。与c的float兼容
        float64                  f8或d        标准的双精度浮点数。与c的double和Python的float对象兼容
        float128                 f16或g       扩展精度浮点数
        complex64、complex128     c8、c16     分别用两个32位、64位或128位浮点数表示的
        complex256               c32         复数
        bool                     ?           存储True和False值的布尔类型
        '''
        # 3.使用np.round()修改浮点型的小数位数
        print('-' * 10 + '使用np.round()修改浮点型的小数位数')
        list1=[random.random() for i in range(6)]
        c=np.array(list1)
        d=np.round(c,2)
        print(d)
        '''
        np.round()的返回值是一个新数组
        '''
        # ----------学习总结----------
        '''
        1.numpy中的方法
        np.dtype    返回结果为数组的数据类型
        np.astype   修改数组的数据类型
        np.round    修改数组的小数位数
        2.创建数组时候指定数据类型的方法有3种:
        a=np.array([1,2,3,4,5,6],dtype="int8")
        a=np.array([1,2,3,4,5,6],dtype='i1')
        a=np.array([1,2,3,4,5,6],dtype=np.int32)
        '''
    # 数组的形状
    def Array_Shape(self):
        '''数组的形状就是表示这个数组是几行几列的数组'''
        a=np.arange(0,12)
        print(a)

        # 1.使用np.reshape修改数组的形状
        print('-' * 10 + '1.使用np.reshape修改数组的形状')
        b=a.reshape(3,4)
        '''
            3,4表示二维数组为3行4列
        '''
        print(b)

        # 2.使用np.shape输出数组的形状
        print('-' * 10 + '2.使用np.shape输出数组的形状')
        print(b.shape)

        # 3.表示一维数组形状的数字
        print('-' * 10 + '3.表示一维数组形状的数字')
        print(a.shape)

        c=b.reshape(12,)
        print(c)
        d=b.reshape(12,1)
        print(d)
        '''
            (12,)表示一维数组,该数组中有12个元素,而(12,1)则表示是行数为12列数为1的二维数组
            同理(1,12)表示行数为1行12列的二维数组
        '''

        # 4.了解三维数组
        print('-' * 10 + '4.了解三维数组')
        e=a.reshape((2,2,3)) # 第1个2表示数组又包含了2个数组
        print(e)
        # ----------学习总结----------
        '''
            1.一般计算都是2维数据,即便数据的维度很高,我们也会尝试将其转换为二维数据。       
            2.修改数组形状的参数中的所有数字相乘如果不等于数组中的元素数,则程序会报错。
            3.reshape的参数转入元组(1,2)和直接传两个数字的运行结果一样。

        '''

        # 5.使用np.flatten()将多维数组转化为一维数组
        print('-' * 10 + '5.使用np.flatten()将多维数组转化为一维数组')
        f=e.flatten()
        print(f)
    # 数组的计算
    def Array_Calulate(self):
        # 1.数组和数字的计算
        print('-' * 10 + '1.数组和数字的计算')
        a=np.arange(12).reshape(3,4)
        print(a+2)
        print(a-5)
        print(a*2)
        print(a/0)
        '''
            1.数字和数字的加减乘除运算的规律:数组中每一个元素的都同该数字进行加减乘除运算
            2.数组除以0,运行结果会弹出警告提示,但仍然会有运算结果
        '''

        # 2.数组与数组的计算
        print('-' * 10 + '2.数组与数组的计算')
        t1=np.arange(6).reshape(3,2)
        t2=np.arange(10,16).reshape(3,2)
        print(t1+t2)
        print(t1-t2)
        print(t1*t2)
        print(t1/t2)
        '''
            1.当两个数组形状一样的时候,是可以进行加减乘除运算的
            2.运算规律:相同位置的数组元素进行加减乘除运算
        '''

    # 读取本地数据
    def Read_Data(self):
        path="学生成绩.csv"
        t1=np.loadtxt(fname=path,delimiter=',',dtype='int8',unpack=0)
        print(t1)
        print(t1.shape)
        print(t1.dtype)
        '''
        读取文本文件np.loadtxt的使用方法:
        fname:指定文件路径
        delimiter:指定边界符号。不指定会导致每行数据为一个整体的字符串而报错。
        dtype :指定数组的数据类型,参数同创建时指定数据类型章节。默认情况下对于较大的数据会将其变为科学计数的方式,未加时显示数据类型为float64
        unpack :默认是Flase或0,按原有csv中的行列样式加载数据;指定为True或1,加载出来的数据相当于转置的效果
        '''
    # 数组的转置
    def Array_Transpose(self):
        # 1.转换前的数组
        print('-' * 10 + '1.转换前的数组')
        t1=np.arange(24).reshape(4,6)
        print(t1)
        # 2.转置后的数组
        print('-' * 10 + '2.转置后的数组')
        t2=t1.transpose()
        print(t2)
        # 3.数组转置的简单写法
        print('-' * 10 + '3.数组转置的简单写法')
        t3=t1.T
        print(t3)
        # 4.数组转置的第三种写法
        print('-' * 10 + '4.数组转置的第三种写法')
        t4=t1.swapaxes(1,0)
        print(t4)
        '''
        转置是一种变换,对于numpy中的数组来说,就是在对角线方向交换数据,说白了转置即行列互换。
        数组的转换共有3种方法:
            1.t1.transpose()
            2.t1.T
            3.t1.swapaxes(1,0)
        '''
    # 显示关于数组轴的讲解资料
    def Array_Axis(self):
        Array_Axis_Dialog=QDialog()
        Array_Axis_Dialog.setWindowTitle('数组的轴')
        mainLay=QVBoxLayout()

        Text_Label=QLabel()
        Array_Axis_Text = '''在numpy中可以理解为方向,使用0,1,2...数字表示,对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有O轴和1轴,对于三维数组(shape(2,2,3),有0,1,2轴
        有了轴的概念之后,我们计算会更加方便,比如计算一个2维数组的平均值,必须指定是计算哪个方向上面的数字的平均值
        那么问题来了:
        在前面的知识,轴在哪里?
        回顾np.arange(0,10).reshape((2,5)),reshpe中2表示0轴长度(包含数据的条数)为2,1轴长度为5,2*5一共10个数据
        '''
        Text_Label.setText(Array_Axis_Text)
        mainLay.addWidget(Text_Label)

        # 二维数组
        Pct_Label_Dimension2=QLabel()
        Pct_Label_Dimension2.setPixmap(QPixmap('二维数组的轴.jpg'))
        mainLay.addWidget(Pct_Label_Dimension2)

        # 三维数组
        Pct_Label_Dimension3 = QLabel()
        Pct_Label_Dimension3.setPixmap(QPixmap('三维数组的轴.jpg'))
        mainLay.addWidget(Pct_Label_Dimension3)

        Array_Axis_Dialog.setLayout(mainLay)
        Array_Axis_Dialog.exec()
    # 数组的切片和索引
    def Array_Index(self):
        t1=np.arange(35).reshape(5,7)
        print(t1)
        # 1.读取一行
        print('-' * 10 + '1.读取一行')
        print(t1[1])
        # 2.读取多行
        print('-' * 10 + '2.读取多行')
        print(t1[1:3])
        # 3.读取一列
        print('-' * 10 + '3.读取一列')
        print(t1[:,1])
        # 4.读取多列
        print('-' * 10 + '4.读取多列')
        print(t1[:,3:5])
        # 5.读取行列交叉点
        print('-' * 10 + '5.读取行列交叉点')
        print(t1[3,5],type(t1[3,5]))
        # 6.读取行列交叉区域
        print('-' * 10 + '6.读取行列交叉区域')
        print(t1[1:3, 3:5])
        # 7.索引参数传入列表
        print('-' * 10 + '7.索引参数传入列表')
        print(t1[[0,2],[1,2]])
        # 8.传入range()参数
        print('-' * 10 + '8.传入range()参数')
        print(t1[range(3),range(2,5)])
        print(t1[[0,1,2],[2,3,4]])
        '''
            数组的索引语法:
            t1[l1,l2],参数l1,l2分别可遍历的对象,其他元素为整数。如列表,range(),数字,数字:数字的区间
            t1[[0,2],[1,2]]表示坐标(0,1),(2,2)对应的数值
            t1[1:3]表示区间[1,3)行,包括1但不包括3,其他数字区间含义同理
            t1[3,5]表示第3行和第5列交叉点的数据
            t1[range(3),range(2,5)]输出结果同t1[[0,1,2],[2,3,4]]表示输出多个坐标点的数据            
        '''
    # numpy中数据的修改
    def Numpy_Data_Change(self):
        t1=np.arange(63).reshape(7,9)
        print(t1)
        # 1.修改索引区域的值
        print('-' * 10 + '1.修改索引区域的值')
        t1[3:6,1:3]=100
        print(t1)
        # 2.通过索引修改数组中的数据
        print('-' * 10 + '2.通过索引修改数组中的数据')
        t1[t1<51] = 100
        print(t1)

    # numpy的布尔值
    def Numpy_Bool_Index(self):
        t1=np.arange(63).reshape(7,9)
        print(t1)
        # 1.numpy中的布尔索引值
        print('-' * 10 + '1.numpy中的布尔索引值')
        a=t1<30
        print(a)
        # 2.通过布尔索引值修改数组中的数据
        t1[t1<30]=100
        print(t1)
    # numpy中三元运算符
    def Numpy_Ternary_Operate(self):
        t1=np.arange(63).reshape(7,9)
        print(t1)
        # 1.通过三元运算符个数数组中的数据
        print('-' * 10 + '1.通过三元运算符个数数组中的数据')
        t2=np.where(t1<30,100,200)
        print(t2)
        '''
        三元运算符的返回值是一个新的数组,语法:
        t2=np.where(t1<30,100,200),数组中为的数值小于30时返回100,否则返回200
        '''
        # 2.通过两次使用布尔值达到三元运算符的修改效果
        print('-' * 10 + '2.通过两次使用布尔值达到三元运算符的修改效果')
        t1[t1>=30]=200
        t1[t1<30]=100
        print(t1)
        '''
            不管是三元运算还是布尔索引中的表达式,只支持t1<num1,或大于t1>num2之类的表达式
            不支持num1<t1<num2这样的表达式
        '''
    def Numpy_Clip(self):
        # 1.无nan之clip

        t1=np.arange(56).reshape(7,8)
        t2=t1.clip(20,36)
        print(t2)
        '''
            t1.clip(20,36)的返回值是一个新的数组
            t1中的数据,小于20的被替换成了20,大于36的被替换成36
        '''
        # 2.有nan之clip
        t3=np.arange(56).reshape(7,8)
        t4=t3.astype(float)
        t4[t4<10]=np.nan
        t5=t4.clip(28,36)
        print(t5)
        '''
            clip修改数据对nan不起作用
            同理布尔值和np.where修改数组同样对nan不起作用,该结论已经验证过
            
        '''
    def Numpy_Nan(self):
        # 1.将数组中的数据类型改为float类型
        print('-' * 10 + '1.将数组中的数据类型改为float类型')
        t1=np.arange(56).reshape(7,8)
        t2=t1.astype(float)
        print(t2)
        # 2.将数组中的数据改为nan
        print('-' * 10 + '2.将数组中的数据改为nan')
        t2[t2>50]=np.nan
        print(t2)
        '''
            只有float数据类型的数组,方可将数据修改为nan,因为nan的数据类型为float
        '''
    def Array_Stack(self):
        t1=np.arange(12).reshape(3,4)
        t2=np.arange(60,72).reshape(3,4)
        # 1.数组的垂直拼接
        print('-' * 10 + '1.数组的垂直拼接')
        t3=np.vstack((t1,t2))
        print(t3)
        # 2.数组的水平拼接
        print('-' * 10 + '2.数组的水平拼接')
        t4 = np.hstack((t1, t2))
        print(t4)
        '''
        切记:
            vstack和hstack中参数必须是元组
        数组水平或者竖直拼接很简单,但是拼接之前应该注意什么?
        答:竖直拼接的时候,每一列代表的意义相同!!!否则牛头不对马嘴。
           如果每一列的意义不同,这个时候应该交换某一组的数的列,让其和另外一类相同
        '''
    def Array_RouColumn_Exchange(self):
        t1=np.arange(56).reshape(7,8)
        print(t1)
        # 1.将第6行的值赋值给第1行
        print('-' * 10 + '1.将第6行的值赋值给第1行')
        t1[0,:]=t1[6,:]
        print(t1)
        # 2.将t2中的第0和第6行数据互换
        print('-' * 10 + '2.将t2中的第0和第6行数据互换')
        t2 = np.arange(56).reshape(7, 8)
        t2[[0,6],:]=t2[[6,0],:]
        print(t2)
        # 3.将t3中的第0和第7列数据互换
        t3=np.arange(56).reshape(7, 8)
        t3[:,[0,7]]=t3[:,[7,0]]
        print(t3)
        '''
        所谓行列数据互换,实质上,将数组中两行数据索引出来,然后赋值给交换行号位置的数组区域索引。
        此句话总结得不通顺,查这部分资料,需要好好理解琢磨。
        '''
    def Numpy_Nan_Inf(self):
        # 1.指定nan和inf
        a=np.nan
        print(a)
        print(type(a))
        b=np.inf
        print(b)
        print(type(b))
        '''由此可见nan和inf的数据类型为浮点数据类型'''
        # 2.两个nan不相等
        print(np.nan==np.nan)
        # 3.利用两个nan不相等的性质,判断数组中nan的个数
        t1=np.arange(12).reshape(3,4)
        t2=t1.astype(float)
        t2[1,:]=np.nan
        num=np.count_nonzero(t2!=t2)
        print(num)
        # 4.判断数组中的数据是否为nan
        t3=np.isnan(t2)
        print(t3)
        # 5.将数组中的nan修改为某个数值比如99,老师讲得案例是修改为0
        t2[np.isnan(t2)]=99
        print(t2)
        # 6.nan和任意数字计算结果都是nan
        print(3 * np.nan)
        # 7.两个inf相等
        print(np.inf==np.inf)
        # ----------nan和inf的含义
        '''
        1.nan
            nan(NAN,Nan):not a number表示不是一个数字
            什么时候numpy中会出现nan:
            当我们读取本地的文件为float的时候,如果有缺失,就会出现nan
            当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)
        2.inf
            inf(-inf.inf):infinity,inf表示正无穷,-inf表示负无穷
            什么时候回出现inf包括(-inf,+inf)
            比如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)
        '''
        # -----------numpy中的nan的注意点
        '''
        那么问题来了,在一组数据中单纯的把nan替换为0,合适么?会带来什么样的影响?
        比如,全部替换为0后,替换之前的平均值如果大于0,替换之后的均值肯定会变小,所以更一般的方式是把缺失的数值替换为均值中值)或者是直接删除有缺失值的一行
        那么问题来了∶
        如何计算一组数据的中值或者是均值
        如何删除有缺失数据的那一行(列)[在pandas中介绍]
        '''
    def Numpy_Statistics_Function(self):
        t=np.arange(63).reshape(7,9)
        print(t)
        print(type(t))
        # 1.求和:t.sum(axis=None)
        print('-' * 10 + '1.求和:t.sum(axis=None)')
        print(t.sum(axis=0))
        print(type(t.sum(axis=0)))

        # 2.均值:t.mean(axis=None)
        print('-' * 10 + '2.均值:t.mean(axis=None)')
        print(t.mean(axis=0))
        print(type(t.mean(axis=0)))

        # 3.中值:np.median(t,axis=None)
        print('-' * 10 + '3.中值:np.median(t,axis=None)')
        print(np.median(t,axis=0))
        print(type(np.median(t,axis=0)))

        # 4.最大值:t.max(axis=None)
        print('-' * 10 + '4.最大值:t.max(axis=None)')
        print(t.max(axis=0))
        print(type(t.max(axis=0)))

        # 5.最小值:t.min(axis=None)
        print('-' * 10 + '5.最小值:t.min(axis=None)')
        print(t.min(axis=0))
        print(type(t.min(axis=0)))

        # 6.极值(最大值和最小值之差):np.ptp(t,axis=None)
        print('-' * 10 + '6.极值(最大值和最小值之差):np.ptp(t,axis=None)')
        print(np.ptp(t,axis=0))
        print(type(np.ptp(t,axis=0)))

        # 7.标准差:np.std(t,axis=None)
        print('-' * 10 + '7.标准差:np.std(t,axis=None)')
        print(np.std(t,axis=0))
        print(type(np.std(t,axis=0)))
        '''
            axis参数是指数组的数轴
            以上统计函数的计算结果均为数组类型
        '''
    def Special_Array(self):
        # 1.构造全为0数组
        t1=np.zeros(12).reshape(3,4)
        print(t1)
        # 2.构造全为1数组
        t2=np.ones(12).reshape(3,4)
        print(t2)
        # 3.创建一个对角线为1的正方形数组(方阵)
        t3=np.eye(3)
        print(t3)
    # 获取行列的最大值最小值
    def Get_MaxMin(self):
        path = "学生成绩.csv"
        t1 = np.loadtxt(fname=path, delimiter=',', dtype='int8', unpack=0)
        print(t1)
        print(np.max(t1,axis=1))
        print(np.min(t1,axis=1))
        '''
            实际上本节讲的这两个方法在包含在统计函数中
        '''

app = QApplication(sys.argv)
w = MyWin()
w.show()
app.exec()

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值