环境安装
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.array(object,dtype,shape)
- 方法:numpy.asarray(object,dtype)
1 object 为要转化为 Numpy 数组的数据对象,可以为列表、元组或者数组; 2 dtype 为转化后数组的数据类型,若不设置则与原数据对象的数据类型保持一致。 3 asarray 是对原数组进行的浅拷贝,它是原数组的视图,新数组的内存地址与原数组的内存地址是相同的
- numpy.copy(object)
- object 为要创建副本的数据对象,可以为列表、元组或者数组。
- 利用现有数组生成新数组的方式大概有三种方法,分别为 array 方法、asarray 方法以及 copy 方法
-
生成固定范围的数组
- linspace 方法
- 方法:linspace(start,stop,num)
- start 为数据的起始点。
- stop 为数据的结束点。 包含进
- num 为等步长生成的数据量。
- arange 方法
- 方法:arange(start,stop,step,dtype)
- start 为数据起始点。
- stop 为数据终点, 不包含
- step 为数据之间的步长,默认为 1。
- dtype 用于指定数组的数据类型,默认为浮点型。
- linspace 方法
-
生成随机数组
-
均匀分布随机数组
- 生成均匀分布随机数组主要有 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 为随机数组的形状。
- normal(loc,scale,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]]