环境安装

anaconda 安装 ,conda : python 多版本控制

 1# 查看环境
 2conda env list
 3# 创建环境 ,最新的 python 
 4conda create --name myenv 
 5# 指定 3.10 python 版本
 6conda create -n myenv3.10 python=3.10
 7# 激活
 8conda activate myenv3.10
 9# 删除环境
10conda remove --name myenv3.10 --all
11# 克隆环境
12conda create --name cpname --clone oldname
13pip list 
14conda list

pycharm 配置conda环境。

 1pip install jupyter
 2# 浏览器会打开 jupyter notebook  
 3# 在需要打开的项目中 执行。 
 4jupyter notebook 
 5# 数据分析包,  可以处理表格数据
 6pip install pandas 
 7# 绘图包 
 8pip install matplotlib
 9#  图像处理库, 视频处理
10pip install opencv-python 
11# 安装dataspell, 操控jupyter .

jupyter 魔法命令

%run 运行命令行

%timeit 同行加一行

%%timeit 在其下面运行代码块。

%time

%%time

%run? : 加个? 看使用文档

np.random.<TAB> 查看random中的更多方法

np.random? 看模块的文档

1
2%run xxx.py
3
4%timeit  L=[i**2 for i in range(1000)]
5%time  L=[i**2 for i in range(1000)]

numPy

它是 Python 进行数值计算的一个类库,用来计算、处理高阶矩阵和数组。和 Math、Time 库一样,NumPy 是 Python 中的一个扩展库,提供了 Python 原生所不具备的多维数组对象(类似生活中使用的表格)。另外,NumPy 还有线性代数中的矩阵运算功能等,这为科研和实际工作都带来了不少的便捷。

特定: 底层基于 c 实现比 python 实现同样的功能快数十倍。

Numpy 的数据类型主要分为以下几种。

  • 整数类型:包括 int8、int16、int32、int64,这些类型分别表示 8 位、16 位、32 位、64 位的带符号整数。
  • 浮点类型:包括 float16、float32、float64,这些类型分别表示 16 位、32 位、64 位的浮点数。
  • 复数类型:包括 complex64、complex128,这些类型分别表示 64 位和 128 位的复数。
  • 布尔类型:即 bool_,它只有两个取值:True 和 False。
  • 字符串类型:即 str_,用于存储字符串。

numpy 中的数组

numpy 中的数组 ——ndarray

ndarray 对象分为两个部分:一个部分是 header、一个是 data。header 部分可以理解为数组属性块,里面有着 ndarray 数组对象所需要的一些属性,比如该数组的步长、数组的形状、数组中数据的类型,等等。data 部分就可以理解为 C 语言中的数组了,存储的是数据。

numpy数组创建

  • zeros 方法创建全 0 数组 , ones 方法创建全 1 数组

    • 不管是 0 填充还是 1 填充,默认的数据类型都是为浮点数
  • full 指定值创建数组

    • np.full((3, 5), 666)
    • np.full(fill_value=666, shape=(3, 5))
  • empty 方法创建未初始化数组

    • empty 方法是用来创建一个指定形状、指定数据类型并且未初始化的数组。未初始化指的就是对于其中的数据并没有被指定填充值。
  • eye 方法创建对角数组

  • 从现有数组中生成新数组

    • 利用现有数组生成新数组的方式大概有三种方法,分别为 array 方法、asarray 方法以及 copy 方法
      • 方法:numpy.array(object,dtype,shape)
        1object 为要转化为 Numpy 数组的数据对象,可以为列表、元组或者数组;
        2dtype 为转化后数组的数据类型,若不设置则与原数据对象的数据类型保持一致;
        3shape 用于指定数组的形状,若不设置则与原数据对象的 shape 相同。  
        
    • 方法:numpy.asarray(object,dtype)
      1 object 为要转化为 Numpy 数组的数据对象,可以为列表、元组或者数组;
      2 dtype 为转化后数组的数据类型,若不设置则与原数据对象的数据类型保持一致。
      3  asarray 是对原数组进行的浅拷贝,它是原数组的视图,新数组的内存地址与原数组的内存地址是相同的
      
    • numpy.copy(object)
      • object 为要创建副本的数据对象,可以为列表、元组或者数组。
  • 生成固定范围的数组

    • linspace 方法
      • 方法:linspace(start,stop,num)
      • start 为数据的起始点。
      • stop 为数据的结束点。 包含进
      • num 为等步长生成的数据量。
    • arange 方法
      • 方法:arange(start,stop,step,dtype)
      • start 为数据起始点。
      • stop 为数据终点, 不包含
      • step 为数据之间的步长,默认为 1。
      • dtype 用于指定数组的数据类型,默认为浮点型。
  • 生成随机数组

    • 均匀分布随机数组

      • 生成均匀分布随机数组主要有 rand 方法和 uniform 两种方法。
      • rand 用于生成 0-1 区间内指定数量的均匀分布的随机数组。
      • uniform 方法用于生成指定范围内的均匀分布的数组,相较于 rand 方法更为灵活 , uniform(low,high,size)
      • randint
        • np.random.randint(0, 10) # [0, 10)之间的随机数
        • np.random.randint(0, 10, 10) # array([2, 6, 1, 8, 1, 6, 8, 0, 1, 4])
        • np.random.randint(0, 10, size=(3,5))
    • 正态分布随机数组

      • normal(loc,scale,size)
        • loc 为正态分布数组的均值,
        • scale 为数组的方差,
        • 通过 size 属性我们能够设置数组的形状或者数据量。
      • standard_normal(size)
        • 利用 standard_normal 方法用于生成指定形状的符合标准正态分布的数组
        • size 为随机数组的形状。
 1import numpy as np  
 2zeroArry=np.zeros((6,8))  
 3print(zeroArry)
 4
 5oneArry=np.ones((3,4))  
 6print(oneArry)
 7
 8emptyArry=np.empty((3,4))  
 9print(emptyArry)
10
11
12eyeArry=np.eye(5)  
13print(eyeArry)
14"""
15[[1. 0. 0. 0. 0.]
16 [0. 1. 0. 0. 0.]
17 [0. 0. 1. 0. 0.]
18 [0. 0. 0. 1. 0.]
19 [0. 0. 0. 0. 1.]]
20"""
21
22
23# 从现有数组中生成新数组
24arr1=np.array([1,2,3,4,5])  
25arr2=np.array(arr1)  
26print(arr2)
27
28
29
30arr1=np.array([1,2,3,4,5])  
31arr3=np.asarray(arr1)  
32print(arr3)
33
34
35
36arr1=np.array([1,2,3,4,5])  
37arr4=np.copy(arr1)  
38print(arr4)
39
40# 生成固定范围的数组
41arr=np.linspace(0,100,5)  
42print(arr)
43# [  0.  25.  50.  75. 100.]
44
45
46arr=np.arange(0,100,5)  
47print(arr)
48# [ 0  5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95]
49
50# rand 用于生成 0-1 区间内指定数量的均匀分布的随机数组。
51arr=np.random.rand(15)  
52print(arr)
53# [0.62143845 0.12778872 0.87422787 0.95940872 0.66958581 0.15454008
54 0.76071261 0.15836626 0.77351804 0.87778616 0.20672373 0.85318471
55 0.98831228 0.21829142 0.83702802]
56 
57
58arr=np.random.uniform(-100,100,1)  
59print(arr)

numpy的索引与切片

 1import numpy as np  
 2Score1=np.array([69,80,90,40,60,20,90,94,90,99])
 3print(Score[4])
 4# 60 
 5
 6
 7Score1=np.array([69,80,90,40,60,20,90,94,90,99])
 8print(Score1[[0,3,4]])
 9# [69 40 60] 
10
11# 反向索引
12Score1=np.array([69,80,90,40,60,20,90,94,90,99])
13print(Score1[-1])
14# 99
15
16# 访问连续的元素
17Score1=np.array([69,80,90,40,60,20,90,94,90,99])
18print(Score1[[0,1,2,3,4,5,6,7,8]])
19print(Score1[:9])
20 

二维数组的索引与切片

方法为:arr2[row,col],row 表示第几行,col 表示第几列。

1
2Score2=np.array([[69,40,30],[80,90,40],[90,100,50],[40,20,99],[60,60,66],
3                 [20,66,44],[90,88,56],[94,99,67],[90,20,70],[99,50,86]])
4 print(Score2[0,1])
5 # 40 

arr2[[row1,row2,…][col1,col2,…]],访问的是数组(row1,col1)、(row2、col2)、……位置上的元素,

 1Score2=np.array([[69,40,30],[80,90,40],[90,100,50],[40,20,99],[60,60,66],
 2                 [20,66,44],[90,88,56],[94,99,67],[90,20,70],[99,50,86]])
 3 print('学号为1的同学的语文和英语成绩为',Score2[[0,0],[0,2]])
 4 # 学号为 1 的同学的语文和英语成绩为 [69 30]
 5 
 6 
 7 Score2=np.array([[69,40,30],[80,90,40],[90,100,50],[40,20,99],[60,60,66],
 8                 [20,66,44],[90,88,56],[94,99,67],[90,20,70],[99,50,86]])
 9 print('所有同学的语文成绩为',Score2[:,0])
10 print('学号为1、2、3的同学的所有科目成绩为',Score2[:3,:])
11 print('学号为1、2、3的同学的语文和数学成绩为',Score2[:3,:2])
12 
13 
14 # 得到该班级所有同学的语文成绩和数学成绩
15Score2=np.array([[69,40,30],[80,90,40],[90,100,50],[40,20,99],[60,60,66],  
16                 [20,66,44],[90,88,56],[94,99,67],[90,20,70],[99,50,86]])  
17print('班级语文成绩和数学成绩为:',Score2[...,0:2])
18
19# 访问一行值
20
21Score2=np.array([[69,40,30],[80,90,40],[90,100,50],[40,20,99],[60,60,66],
22                 [20,66,44],[90,88,56],[94,99,67],[90,20,70],[99,50,86]])
23 print('查看学号为1的同学的成绩:',Score2[0])
24 print('查看学号为1、2的两位同学的成绩',Score2[[0,1]])
25 print(查看学号1-9的同学的成绩',Score2[:9])

三维数组的索引与切片

三维数组主要应用于图片的处理,可以使用三维数组的三个维度分别指出图片的高、宽以及三原色来表示一个图片。

三维好比是 魔方

访问离散的元素 方法为:arr3[dim1,dim2 , dim3],dim1、dim2、dim3 分别代表三维数组的三个维度的索引。

1Space=np.array([
2    [[5,4,8],[5,9,2],[4,5,3]],
3    [[4,9,6],[2,2,5],[4,3,4]],
4    [[4,2,1],[7,6,3],[4,6,5]]
5                ])
6 print(Space[0,0,0])

方法为:arr2[[row1,row2,…],[col1,col2,…],[high1,high2]],访问的是数组(row1,col1,high1)、(row2、col2,high2)…位置上的元素。

 1
 2# 以查询空间坐标为(0,0,0)、(0,1,0),(1,2,2)的子空间的蚊子密度为例
 3Space=np.array([
 4    [[5,4,8],[5,9,2],[4,5,3]],
 5    [[4,9,6],[2,2,5],[4,3,4]],
 6    [[4,2,1],[7,6,3],[4,6,5]]
 7                ])
 8 print(Space[[0,0,1],[0,1,2],[0,0,2]])
 9 # [5 5 4]
10 

访问连续的元素

方法为:arr2[row_start:row_end:step,col_start:col_end:step,high_start:high_end:step]

1Space=np.array([
2    [[5,4,8],[5,9,2],[4,5,3]],
3    [[4,9,6],[2,2,5],[4,3,4]],
4    [[4,2,1],[7,6,3],[4,6,5]]
5            ])
6 print(Space[:1,:1,:2])
7 print(Space[:1,:,:])
8 print(Space[:1,1:2,:])

索引的高级操作

布尔索引

方法为:arr[bool_list],其中 bool_list 为布尔类型的列表。

1row=['美的','格力','海尔','西门子']
2 data=np.array([[3800,1,15],[4000,8,20],[5000,2,30],[4000,20,50]])
3 bool_list=[False,False,True,False]
4 print(data[bool_list])
5 
6 # [[5000    2   30]]
条件索引

方法为:arr[条件语句] 或 numpy.where(条件语句),其中第一个方法直接返回符合条件的元素的值,而第二个方法则返回符合条件的元素的位置。

 1import numpy as np
 2 Score=np.array([69,80,90,40,60,20,90,94,90,99])#学生的成绩
 3 con=Score>60#筛查出分数大于60的分数
 4 print('条件的布尔列表',con)
 5 print('大于60的学生成绩',Score[con])#查看大于60分的学生成绩
 6 print('大于60的学生数组下标',np.where(Score>60))
 7 
 8 
 9# 条件的布尔列表 [ True  True  True False False False  True  True  True  True]
10# 大于60的学生成绩 [69 80 90 90 94 90 99]
11# 大于60的学生数组下标 (array([0, 1, 2, 6, 7, 8, 9], dtype=int64),)

numpy 数组运算

numpy广播机制

 1Arr1=np.array([1,2,3])
 2print(Arr1)  
 3print(Arr1*3)
 4#[1 2 3]
 5#[3 6 9]
 6
 7
 8Arr2=np.array([[1,2,3],[4,5,6]])  
 9Arr1=np.array([1,2,3])  
10print(Arr1)  
11print(Arr2)  
12print(Arr1+Arr2)
13
14#[[2 4 6]
15# [5 7 9]]
16
17
18Arr2=np.array([[1,2,3],[4,5,6]])  
19Arr=np.array([[1],[2]])  
20print(Arr2)  
21print(Arr)  
22print(Arr2+Arr)
23
24#[[2 3 4]
25# [6 7 8]]

标量运算与数组运算的关系

1import numpy as np  
2fruitPrice=np.array([5,4,6,2])  
3addPrice=fruitPrice+1  
4print(addPrice)
5# [6 5 7 3]
6fruitPrice=np.array([5,4,6,2])  
7addPrice=fruitPrice/2  
8print(addPrice)
9# [2.5 2.  3.  1. ]

数组运算

 1import numpy as np  
 2import pandas as pd  
 3Score1=np.array([[38,90,78],[46,66,98],[65,100,55],[46,26,32],[88,45,65]])  
 4Score2=np.array([[38,96,78],[55,76,98],[40,45,99],[46,67,45],[78,30,65]])  
 5print('不同同学两次成绩的和为:',Score1+Score2)  
 6print('不同同学两次成绩的为差:',Score1-Score2)  
 7print('不同同学两次成绩的商为:',(Score1/Score2).astype(float))  
 8print('不同同学两次成绩的积为:',Score1*Score2)
 9print('对第一次同学的成绩进行取余2为:',Score1%2)
10
11
12
13Score1=np.array([[38,90,78],[46,66,98],[65,100,55],[46,26,32],[88,45,65]])  
14Score2=np.array([[38,96,78],[55,76,98],[40,45,99],[46,67,45],[78,30,65]])  
15print('查看成绩是否下降:',Score1>Score2)  
16print('查看成绩是否上升:',Score1<Score2)  
17print('查看成绩是否持平,无波动:',Score1==Score2)
18print('查看成绩是否持平,无波动:',Score1!=Score2)
19
20#查看成绩是否下降:
21
22# [[False False False]
23# [False False False]
24# [ True  True False]
25# [False False False]
26# [ True  True False]]

numpy 计算函数

方法:add() 加法函数,subtract() 减法函数,multiply() 乘法函数,divide() 除法函数,mod() 取余函数。

 1Score=np.array([[69 ,70] ,[80 ,92], [90, 63],[40, 20],[60, 50],[20, 96],[90, 33],[94 ,44],[90, 55],[99 ,30]])#学生前后两次的成绩表  
 2Score_F=np.array([69,80,90,40,60,20,90,94,90,99])#第一次成绩  
 3Score_S=np.array([70,92,63,20,50,96,33,44,55,30])#第二次成绩  
 4Score_chaju=np.subtract(Score_F,Score_S)  
 5print('查看两次成绩的差距:',Score_chaju)
 6# 查看两次成绩的差距: [ -1 -12  27  20  10 -76  57  50  35  69]
 7
 8print('求两次成绩的和',np.add(Score_F,Score_S))
 9# 求两次成绩的和 [139 172 153  60 110 116 123 138 145 129]
10
11# 用第一次成绩的 0.6 倍加第二次成绩的 0.4 倍作为最终成绩,混合使用加法、乘法函数。示例如下:
12print('第一次成绩的0.6加第二次成绩的0.4',np.add(np.multiply(Score_F,0.6),np.multiply(Score_S,0.4)))
13
14# 将成绩除 10 转换成十分制,利用除法函数
15print('百分制转换成十分制',np.divide(Score,10))
16
17
18
19# abs() 函数
20Score=np.array([[69 ,70] ,[80 ,92], [90, 63],[40, 20],[60, 50],[20, 96],[90, 33],[94 ,44],[90, 55],[99 ,30]])#学生前后两次的成绩表  
21Score_F=np.array([69,80,90,40,60,20,90,94,90,99])#第一次成绩  
22Score_S=np.array([70,92,63,20,50,96,33,44,55,30])#第二次成绩  
23Score_chaju=np.subtract(Score_F,Score_S)  
24print('查看两次成绩的差距,差距以正数显示',np.abs(Score_chaju))
25
26# 方法:sqrt(),求平方根
27print('对浮动的数值进行开方,放缩:',np.sqrt(np.abs(Score_chaju)))
28
29# 方法:square(),求平方;power(A,B),求 A 的 B 次幂
30print('对浮动值进行平方,放大',np.square(np.abs(Score_chaju)))  
31print('求浮动值的4次幂',np.power(np.abs(Score_chaju),4))

numpy 统计运算

在数据分析时,因为整组数据各行或者各列代表的意义有所不同。

我们在进行统计时,往往需要求的是某一行或一列的统计量而不是对整组进行统计。

这时我们就要先了解统计函数的一个参数:轴 axis。

  • 当 axis=0 时,表示对每一列数据进行统计运算
  • 当 axis=1 时,表示对每一行数据进行统计。
 1Score=np.array([[69 ,70] ,[80 ,92], [90, 63],[40, 20],[60, 50],[20, 96],[90, 33],[94 ,44],[90, 55],[99 ,30]])#两名选手的比赛成绩  
 2print('张三和李四的最高分',Score.max(axis=0))  
 3print('张三和李四的最低分',Score.min(axis=0))
 4
 5
 6print('最大值下标为:',Score.argmax(axis=0))  
 7print('最小值下标为:',Score.argmin(axis=0))
 8
 9# 修改 ,去掉最大,最小
10Score[[9,5],[0,1]]=0  
11Score[[5,3],[0,1]]=0  
12print(Score)
13
14print('张三李四的平均成绩为:',Score.mean(axis=0))
15# 张三李四的平均成绩为: [61.3 43.7]
16
17print('张三和李四成绩的标准差为:',Score.std(axis=0))  
18print('张三李四的方差为:',Score.var(axis=0))

常量 Π 和 e,在 numpy 中的表示方法是 numpy.pi 和 numpy.e

半径为 2 的圆的面积

1r=2  
2area=np.pi*np.square(r)  
3print(area)

numpy 逻辑运算

在实际应用中,我们可以通过逻辑运算筛选我们所需要的数据。Numpy 主要提供了三个逻辑运算函数,分别为 all、any 和 where 这三个方法

  • all 方法是一个逻辑运算函数,用于检查数组中是否所有元素都满足给定的条件
    • 方法:all(arr,axis),arr 为要进行逻辑运算的数组,axis 指定沿哪个轴进行逻辑运算。
  • any 方法用于检查数组中是否至少有一个元素满足给定的条件
  • where() 方法是一个条件选择函数,它根据给定的条件返回数组中满足条件的元素的索引。
    • 方法:where(condition,x,y),condition 为用于筛选的条件;x 用于替换条件数组中满足条件的元素,如果未提供该参数,则满足条件的元素将被保留在结果数组中;y 用于替换条件数组中不满足条件的元素,如果未提供该参数,则不符合条件的元素将被保留在结果数组中。
    • 当我们不设置 x、y 参数时,该方法会返回符合条件的元素下标。
 1# 序号  语文  数学 的二维表
 2
 3import numpy as np  
 4Score=np.array([[98,89],[64,90],[60,56],[92,78],[32,45],[48,30]])  
 5Score60=Score>60  
 6
 7# 筛选 语文数学都大于 60 
 8Score_bool=np.all(Score60,axis=1)  
 9print(Score_bool)  
10print(Score[Score_bool])
11
12[ True  True False  True False False]
13[[98 89]
14 [64 90]
15 [92 78]]
16 
17 # 查看该班同学的语文和数学成绩是否均及格
18
19Score_bool=np.all(Score60,axis=0)  
20print(Score_bool)
21# [False False]
 1import numpy as np  
 2Score_math=np.array([98,64,60,92,32,48])  
 3print(np.where(Score_math>60))
 4# (array([0, 1, 3], dtype=int64),)
 5
 6# 如果我们想要得到学生成绩的 0-1 数组,将成绩大于 60 的设置为 1,低于 60 设置为 0
 7
 8Score=np.array([[98,89],[64,90],[60,56],[92,78],[32,45],[48,30]]) 
 9print(np.where(Score>60,1,0))
10
11[[1 1]
12 [1 1]
13 [0 0]
14 [1 1]
15 [0 0]
16 [0 0]]