一. Python简介
1. 什么是Python
- 高层次脚本语言
- 集解释性、编译性、互动性、面向对象于一体
- 语法简单易懂,对初学者友好
- 注重如何解决问题,而非编程语言的语法和结构
2. Python语言特点
- 跨平台:Python在不同操作系统上都能运行,无需修改代码。
- 可扩展性:如果需要性能更高或需要与其他语言交互,可以使用C或者C++编写Python扩展模块。
- 运行速度有限,有速度要求的话,可以C++改写关键部分
- 即是优点也是缺点,python的开源性使得语言不能加密。
- 相比于MATLAB,Python是一门真正的通用程序设计语言
二. Python基础入门
1. 基础语法
(1) 注释
- 单行注释使用 # 号,多行注释三个双引号或三个单引号
# 第一个注释 print("Hello,Python!") # 第二个注释 """ 这是多行注释,使用双引号。 这是多行注释,使用双引号。 """
(2) 缩进规则
- python使用缩进来写模块,而非{}
# 利用缩进写if/else语句块,判断x与y大小 x = float(input("Enter a number for x: ")) y = float(input("Enter a number for y: ")) if x == y: print("x and y are equal") print("thanks!")
(3) Print输出
- 用 print() 在括号中加上字符串,就可以向屏幕上输出指定的文字
print("This is CompMat") # 字符串输出
- print() 也可接受多个字符串,用 “,” 隔开
print("This","is","CompMat") # 多个字符串输出
- 字符串包含有单(双)引号,用双(单)引号表示即可
print('"Hello" in "Quotes"') # 带引号的字符串输出
(4) 格式化输出
- print函数默认在输出后添加换行符。若不换行,需要在变量末尾加上end=""或其他非换行符字符串
- 使用字符串的 format() 方法可以格式化输出内容
- Python3.6版本引入了一种新的格式化方式 “f-string”
# 含变量的字符串输出 x = 11 print(x,end="***") # 字符串输出,以"***"结束 print("my fav num is",x,".","x =",x) # 含变量的字符串输出 x_str = str(x) # 将x转换为字符型并赋给x_str print(f"my fav num is {x_str}.x = {x_str}") # f-string格式化输出
(5) 输入
- input 函数可读入用户输入内容,按字符串类型存储
# input函数的使用 text = input("Type anything... ") print(type(text)) # 显示数据类型 num = int(input("Type a number... ")) # 强制转换为整数 print(type(num)) # 输入字符串
2. 基本数据类型
(1) 变量赋值
- Python中的变量不需要声明
1 .每个变量在使用前必须赋值,赋值以后该变量才会被创建
2 .在Python中,变量是个对象,没有类型;所谓“类型”是变量所指的内存中的对象的类型 - 等号 (=) 用来给变量赋值
1 .等号 (=) 运算符左边是一个变量名;等号 (=) 运算符右边是存储在变量中的值
(2) 基础类型
- 布尔 (bool)
只有True和False两个值,表示真或假。True、False可作为0、1与数值类型相加 - 整型 (int)、浮点型 (float)、复数 (complex)
1 .整数值,可正数亦可负数
2 .浮点型由整数部分与小数部分组成,浮点型也可以使用科学计数法表示 (2.5e2 = 2.5×102 = 250)
3 .复数由实数部分和虚数部分构成,可以用 a + b a+b a+bj,或者complex(a,b)表示,复数的实部 a a a和虚部 b b b都是浮点型
(3) 字符串类型
- 字符串 (string)
双引号与单引号等价;字符串可通过 + 进行拼接# example hi = "hello there" name = "Eric" greet = hi + name greeting = hi + " " + name print(greet) print(greeting)
# output: hello thereEric hello there Eric
- 字符串 (string) 可以进行索引、切片(与list类似),但不可部分赋值
# example name = "Eric" print(3*name) print(len(name)) print(name[1]) print(name[1:3])
# output: EricEricEric 4 r ri
(4) 列表 (list)
- 序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字——它的位置,或索引,第一个索引是0,第二个索引是1,依次类推。
- 最常见的是列表 (list)和元组 (tuple)
- 序列都可以进行的操作包括索引,切片,加,乘,检查
- 列表的数据项不需要具有相同的类型
- 创建列表
list1 = [1,2,3,4,5] list2 = ['Google','Bing',1997,2000] # 列表数据类型可以不同 list3 = [[1,2],[3,4]] # 列表可以嵌套
- 更新列表
list1[0] = "baidu" # 更新list1的索引0的值 list1.append(2) # 添加到list1
- 删除列表元素
del list1[2] # 删除索引为2的元素 list.remove(3) # 删除值为3的元素 list.pop(3) # 删除索引为3的元素
- 把元素插入到指定的位置
list1.insert(1,'Jack')
- 切片和拼接
L = ['Google','Bing',1997,2000] L2 = [1,2,3] print('',"L[0]:",L[0]) # 索引为0的元素 print('',"L[-1]:",L[-1]) # 索引为-1,即最后一个 print('',"L[1:]:",L[1:]) # 取索引为1的及后面元素 print('',"L[1:3]:",L[1:3]) #取索引为[1,3)的元素 print('',"L+L2:",L+L2)
# output: L[0]:Google L[-1]:2000 L[1:]:['Bing',1997,2000] L[1:3]:['Bing',1997] L+L2:['Google','Bing',1997,2000,1,2,3]
- 嵌套列表
# example a = ['a','b','c'] n = [1,2,3] x = [a,n] print("x:",x) print("x[0]:",x[0]) print("x[0][1]:",x[0][1])
# output: x:[['a','b','c'],[1,2,3]] x[0]:['a','b','c'] x[0][1]:b
- Python列表常用函数&方法
1 .len(list):列表元素个数
2 .max(list):返回列表元素最大值
3 .min(list):返回列表元素最小值
4 .list(seq):将元组转换为列表
5 .list.append(obj):在列表末尾添加新的对象
6 .list.count(obj):统计某个元素在列表中出现的次数
7 .list.index(obj):从列表中找出某个值第一个匹配项的索引位置
8 .list.reverse():反向列表中元素
(5) 元组 (tuple)
- Python的元组与列表相似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。
- 创建元组
tup1 = ('Google','Bing',1997,2000)
- 组合元组
tup3 = tup1 + tup2
- 删除元组
del tup1
- 元组索引,截取
与列表类似
(6) 集合 (set)
- 集合跟数学上的集合是一致的,不允许有重复元素,而且可以进行交集、并集、差集等运算
- 创建集合
可以使用大括号{}或者set()函数创建集合set1 = set('abracadabra') print(set1) # ('a','r','b','c','d')
- 添加元素
set1.add("f")
- 移除元素
set1.remove("a")
- 数学操作
交集:set1 & set2 并集:set1 | set2 差集:set1 - set2
(7) 字典 (dictionary)
- 字典是另一种可变容器模型。与列表、集合不同的是,字典的每个元素都是由一个键和一个值组成的 “键值对”,键和值通过冒号分开。
dict1 = {key1 : value1 , key2 : value2 , key3 : value3} - 键必须是唯一的,但值则不必,值可以取任何数据类型,但键必须是不可变的,如字符串,数字,元组。
- 访问字典里的值
通过键可以获取字典中对应的值,使用字典里没有的键访问数据会报错v1 = dict1["key1"] # v1 = value1
- 更新字典中的元素
dict1["key2"] = 10 # value = 10
- 删除字典元素
del dict1['Name']
3. 运算符
(1) 基本运算符
算数运算符 | # | 比较运算符 | # | 赋值运算符 | # |
---|---|---|---|---|---|
+ - | 加 减 | == | 等于 | = | 简单的赋值运算符 |
* / | 乘 除 | != | 不等于 | += | 加法赋值运算符 |
** | 幂 | > | 大于 | -= | 减法赋值运算符 |
// | 整除 | < | 小于 | *= | 乘法赋值运算符 |
% | 取模 | >= | 大于等于 | /= | 除法赋值运算符 |
a = 5 ** 3
print(a) # 125
flag = (1 <= 2 <= 3)
print(flag) # True
b = 2
b += 1 # b = 3
b *= b+2 # b = b*(b+2)
print(b) # 15
(2) 逻辑运算符
运算符 | 逻辑表达式 | 描述 |
---|---|---|
and | x and y | 如果两个操作数都为True,则返回True;否则返回False |
or | x or x | 如果两个操作数中至少有一个为True,则返回True;如果两个操作数都为False,则返回False |
not | not x | 用于取反操作,如果操作数为True,则返回False;如果操作数为False,则返回True |
flag0 = True and False # flag0 = False
flag1 = True or False # flag1 = True
flag2 = not (1 != 2) # flag2 = False
# 判断是否为闰年:
year % 4 == 0 and year % 100 != 0 or year % 400 == 0
(3) 运算符实例
# 判断输入数的奇偶
x = int(input('Enter an integer:'))
if x%2 == 0:
print('Even')
else:
print('Odd')
print('Done with conditional')
# output:
Enter an integer:7
Odd
Done with conditional
4. 流程控制
(1) 什么是流程控制
在进行程序设计的时候,我们会经常进行逻辑判断,根据不同的结果做不同的事,或者重复做某件事,我们对类似这样的工作称为流程控制
- 顺序控制
从左到右,从上到下的顺序依次执行每条语句操作 - 条件控制(选择控制)
基于条件选择执行语句,比方说,如果条件成立,则执行操作A,或者如果条件成立,则执行操作A,反之则执行操作B - 循环控制
循环控制,又称为回路控制,根据循环初始条件和终结要求,执行循环体内的操作
(2) 选择控制
- if 语句(决策)
Python 中用elif替代了else if,所以if语句的关键字为:if—elif—else
f ( x ) = { 3 x − 5 ( x > 1 ) x + 2 ( − 1 ≤ x ≤ 1 ) 5 x + 3 ( x < − 1 ) f(x)=\begin{cases} 3x-5 & (x>1)\\x+2 & (-1\le x\le 1) \\5x+3 & (x<-1) \end{cases} f(x)=⎩ ⎨ ⎧3x−5x+25x+3(x>1)(−1≤x≤1)(x<−1)# example x = float(input('x = ')) if x > 1: y = 3 * x - 5 elif x >= -1: y = x + 2 else: y = 5 * x + 3 print(f'f({x}) = {y}')
(3) while循环
- while中的else是可选的,如果提供了else语句,则else语句一定执行。除非是通过break语句退出的循环
# example n = input("You are lost in a forest.Go left or right?") while "right" == n: n = input("You are lost in a forest.Go left or right?") print("You got out of the forest!")
# output: You are lost in a forest.Go left or right? right You are lost in a forest.Go left or right? right You are lost in a forest.Go left or right? left You got out of the forest!
(4) for循环
- 可遍历序列成员(字符串、列表、元组)
- 可遍历任何可迭代对象(字典、文件等)
sum = 0 for i in range(1,100,2): sum += i print('The sum of odd numbers from 0 to 100:',sum)
# output: The sum of odd numbers from 0 to 100:2500 # range(start,stop[,step]) 返回的是一个可遍历序列对象,计数区间为[start,stop),两个数间隔(步长)为step
# example s = "abcdefgh" for index in range(len(s)): # 通过索引获取元素 if 'i' == s[index] or 'u' == s[index]: print("There is an i or u") for char in s: # 直接从字符串中取出元素 if 'i' == char or 'u' == char: print("There is an i or u")
- 循环控制语句
1 .break
用在for循环和while循环语句中。break语句是会立即退出循环,在其后边的循环代码不会被执行
2 .coutinue
使循环跳过其主体的剩余部分,并立即进入下一次循环
3 .pass
当语法需要但不需要执行任何命令或代码时,Python中就可以使用pass语句,此语句什么也不做,用于表示“占位”的代码numbers = [1,2,3,4,5] for num in numbers: if num % 2 == 0: continue print(num) for num in numbers: if num == 3: break print(num) for num in numbers: if num == 3: pass print(num)
(5) 列表推导式
- 利用列表推导式能更简单的创建列表的方法,语法如下:
[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]]# example x = [1,2,3,4,5,6] out1 = [n ** 2 for n in x] print(out1) # [1,4,9,16,25,36] out2 = [n ** 2 for n in x if n % 2 == 0] print(out2) # [4,16,36]
5. 函数
(1) Python函数
- 什么是函数?
如果我们再开发程序的时候,某一段代码,需要执行很多次,但是为了提高编写的效率以及代码的复用,所以我们把这一段代码封装成一个模块,这就是函数。 - 函数的作用
函数能提供应用的模块性,和代码的重复利用率
注:Python提供了许多内建函数,比如print()。但也可以自己创建函数,这被叫做用户自定义函数
(2) 定义函数
- 函数由两部分组成:声明部分和实现部分
- 函数名:类似于变量名,尽量做到顾名思义
- 参数1,参数2,参数3…:参数列表(形式参数,简称为形参),其实本质上就是一个变量名
- 函数体:封装的功能代码
- 返回值:一般用于结束函数,可有可无,如果有返回值,则表示将相关的信息携带出去,携带给调用者,如果没有返回值,则相当于返回None
def is_even(i): """ Input: i,a positive int Returns True if i is even,otherwise False """ return 0 == i % 2 # 函数体 print('',is_even(3)) # 函数调用
(3) 默认参数
- 函数的参数可以有一个默认值,默认参数以赋值语句的形式提供
- 函数调用时如果没有提供这个参数,它就取这个值作为默认值
def my_abs(x=3): if x >= 0: return x else: return -x print(my_abs()) print(my_abs(-4))
(4) 位置参数
- 一个函数可以有多个参数,各个参数用逗号隔开
- 在定义函数时有N个参数。在调用时,也需要提供N个参数
def my_max(number1,number2): if number1 > number2: print(number1) else: print(number2) my_max(4,10)
(5) 关键字参数
- 如果在函数里边,定义了10个参数,那每次必须都要按照位置写,容易造成混乱。这时候,我们可以用关键字参数。使用关键字参数允许函数调用时参数的顺序与声明时不一致
def my_hobby(name,hobby) print('',name+"喜欢"+hobby) my_hobby("DaChu","Python") my_hobby("Python","DaChu") my_hobby(hobby="Python",name="DaChu")
三. 科学计算包Numpy
1. 什么是模块
(1) 什么是Python Modules
Python Module(模块),包含Python对象定义和Python语句。模块能定义函数、类和变量,也可以包含可执行的代码。
- 每一个以扩展名 py 结尾的 Python 源代码文件都是一个 模块
- 模块名同样也是一个标识符,需要符合标识符的命名规则
- 在模块中定义的全局变量、函数、类都是提供给外界直接使用的 工具
- 模块 就好比是 工具包,要想使用这个工具包中的工具,就需要先导入这个模块
(2) 如何导入和使用Modules
- 采用 import module_name
1.可以通过import关键字导入模块,如下: import math 2.导入多个模块时,以逗号相隔 import math,numpy... 3.导入多个模块时,建议采用每个模块单独占行的模式 import math import numpy
- 模块导入后,可以通过 module_name.method 的方式使用提供的工具——函数、类、全局变量
# 示例如下 import math import numpy math.sin(math.pi) numpy.random.rand(3)
- 采用 from module_name import method
1.如果希望从某一个模块导入一部分指定工具 ,可以使用from ... import ...的方式 # 示例如下 from math import sin,cos from numpy import random 2.通过这种方式导入,不需要再通过模块名,可以直接使用其提供的工具——函数、类、全局变量 # 示例如下 from math import sin,cos print(sin(0.5))
- 采用 import module_name as alias
模块导入后,可以通过alias.method的方式使用提供的工具——函数、类、全局变量 # 示例如下 import numpy as np import pandas as pd a = np.sin(0.5)
(3) 常用的Modules及功能
名称 | 功能 | 常用指令 |
---|---|---|
os 模块 | 提供与操作系统交互的函数和方法,如文件路径操作、进程管理等 | os.getcwd() 获取当前工作目录 os.listdir(path) 列出指定目录的文件名 os.remove(path) 删除指定路径的文件 |
math 模块 | 提供数学运算相关功能,包括数值运算、三角函数、对数等 | math.pi 获取圆周率
π
\pi
π的值 math.sqrt(x) 计算平方根 math.sin(x) 计算正弦值 |
numpy 模块 | 用于进行科学计算和数值操作,提供了多维数组对象和各种数学函数 | numpy.array(object) 创建一个数组 numpy.zeros(shape) 创建一个指定形状的全零数组 numpy.mean(array) 计算数组的平均值 |
pandas 模块 | 用于数据分析和处理,提供了高性能、易用的数据结构和数据分析工具 | pandas.DataFrame(data) 创建一个数据帧对象 pandas.read_csv(filepath) 从CSV文件读取数据 pandas.DataFrame.describe() 统计数据的基本信息 |
matplotlib 模块 | 用于绘制各种类型的图表和可视化,提供了类似于MATLAB的绘图接口 | matplotlib.pyplot.plot(x,y) 绘制折线图 matplotlib.pyplot.scatter(x,y) 绘制散点图 matplotlib.pyplot.xlabel(label) 设置x轴标签 |
2. Numpy简介
(1) 什么是Numpy
NumPy(Numerical Python)是使用Python进行科学计算的基础软件包
- 支持高纬度数组和矩阵运算
- 针对数组运算提供大量的数学函数库
- 底层主要用C语言编写,能够高效地执行数值计算
- Numpy的核心是连续的多维数组
(2) Numpy的优点
- 与list不同,Numpy数组存储在内存中的一个连续位置,因此进程可以非常有效地访问和操作他们
例: 1000 x 1000 matrix multiply Python triple loop tasks > 10 min Numpy tasks ~0.03 seconds
- NumPy(Numerical Python) 支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库
(3) Numpy的使用
- 引入numpy第三方库
- 在终端命令行键入下列命令安装numpy:
pip install numpy - 进去Python,键入下列命令引入numpy:
import numpy as np
- 在终端命令行键入下列命令安装numpy:
- 创建数组
m = np.array([1,2,3])
(4) 与list的差别
- NumPy中,通过使用数组对象执行列表相加操作,逐个对应元素相加返回一个新的数组
# 使用NumPy进行列表相加 import numpy as np arr1 = np.array([1,2,3]) arr2 = np.array([4,5,6]) result1 = arr1 + arr2 print(result1) # 输出:[5,7,9]
- 在Python列表中,list相加等同于列表串联
# 使用Python列表进行列表相加 list1 = [1,2,3] list2 = [4,5,6] result2 = list1 + list2 print(result2) # 输出:[1,2,3,4,5,6]
3. Numpy 数组
(1) 创建数组
- 什么是ndarray
numpy.ndarray:ndarray是N维数组类型的对象,与python基本数据列表相比具有以下特点:
I 存放同类型元素(列表可以存储不同类型的数据)
II ndarray以 0 下标为开始索引
III Ndarray在存储的数据类型上做限制,换取了运算效率的提升 - Numpy的一维数组
1.查询数组的类型:type a = np.array([1.2,2.0,3.0,-1.0,2.0]) print(type(a)) 输出:<class'numpy.ndarray'> 2. 获取数组中有多少元素:len/shape(形状) print(len(a)) print(a.shape) 输出:5 (5,)
- Numpy的二维数组
创建Numpy二维数组(矩阵): A = np.array([[2.0,-1.0,0.0,0.0,0.0], [-1.0,2.0,-1.0,0.0,0.0], [0.0,-1.0,2.0,-1.0,0.0], [0.0,0.0,-1.0,2.0,-1.0], [0.0,0.0,0.0,-1.0,2.0] ]) A.ndim # 查看维度 2 A.shape # 查看形状 (5,5)
- 特殊矩阵的创建方法
1.创建单位矩阵:np.eye() np.eye(5) array([[1.,0.,0.,0.,0.], [0.,1.,0.,0.,0.], [0.,0.,1.,0.,0.], [0.,0.,0.,1.,0.], [0.,0.,0.,0.,1.]]) 2.创建顺序排列矩阵:np.arange().reshape() B = np.arange(25).reshape(5,5) array([[0,1,2,3,4], [5,6,7,8,9], [10,11,12,13,14], [15,16,17,18,19], [20,21,22,23,24]])
- 其他创建array的方法
函数 | 描述 |
---|---|
np.arange(x,y,i) | 创建由x到y,以i为步长的数组 |
np.linspace(x,y,n) | 创建由x到y,等分成n个元素的数组 |
np.random.rand(m,n) | 创建m行n列的随机数组 |
np.ones((m,n),dtype) | 创建m行n列的全1数组,dtype是数据类型 |
np.zeros((m,n),dtype) | 创建m行n列全0数组,dtype是数据类型 |
np.indices((m,n)) | 创建m行n列的矩阵 |
- Numpy数组对象的基本对象
ndarray.ndim | 秩,即轴的数量或维度的数量 |
---|---|
ndarray.shape | 数组的维度,对于矩阵,n 行 m 列 |
ndarray.size | 数组元素的总个数,相当于. shape 中 n*m 的值 |
ndarray.dtype | ndarray对象的元素类型 |
ndarray.itemsize | ndarray对象中每个元素的大小,以字节为单位 |
ndarray.real | ndarray元素的实部 |
ndarray.imag | ndarray元素的虚部 |
(2) 数组的访问
- 一维数组的访问
设有一维数组a:a = np.array([1.2,2.0,3.0,-1.0,2.0]) 访问 a[1] 2.0 访问 a[2:4], array([3.,-1.]) 访问 a[::2] array([1.2,3.,2.]) 访问 a[::-1] array([2.,-1.,3.,2.,1.2])
- 多维数组的访问
设有二维数组A: A = np.array([[2.0,-1.0,0.0,0.0,0.0], [-1.0,2.0,-1.0,0.0,0.0], [0.0,-1.0,2.0,-1.0,0.0], [0.0,0.0,-1.0,2.0,-1.0], [0.0,0.0,0.0,-1.0,2.0] ]) 访问 A[2,2] 2.0 # 第3行3列 访问 A[2] array([0.,-1.,2.,-1.,0.]) # 第3行 访问 A[:3,:3] array([[2.,-1.,0.], # 前3行3列 [-1.,2.,-1.], [0.,-1,2.]])
- Numpy数组索引总结
list的全部索引方式,对于numpy向量、矩阵均可用 - Numpy数组的布尔索引
布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组import numpy as np data = np.array([[1,2],[3,4],[5,6]]) print(data>3) # 返回bool数组 print(data[data>3])
(3) 数组重塑
- 矩阵转置:data.T
- 矩阵重塑:data.reshape()
# 使用reshape更改维度 A = np.array([[2.0,-1.0,0.0,0.0,0.0], [-1.0,2.0,-1.0,0.0,0.0], [0.0,-1.0,2.0,-1.0,0.0], [0.0,0.0,-1.0,2.0,-1.0], [0.0,0.0,0.0,-1.0,2.0] ]) A.reshape((25,)) array([2.,-1.,0.,0.,0.,-1.,2.,-1.,0., 0.,0.,-1.,2.,-1.,0.,0.,0.,-1.,2.,-1., 0.,0.,0.,-1.,2.])
4. Numpy运算
(1) 数组运算
- Numpy的基本运算
Python的基本运算符在numpy数组中都能使用import numpy as np data = np.array([1.2,2.0,3.0,-1.0,2.0]) print(data * 2) # 乘 print(data ** 2) # 幂 print(data / 2) # 除 print(data //2) # 整除 print(data % 2) # 取模
- Numpy的函数运算
基本运算函数:函数可作用于数组内每个元素
基本运算函数 | # |
---|---|
np.sin(ndarray) | sin(x) |
np.tan(ndarray) | tan(x) |
np.exp(ndarray) | e^x |
np.abs(ndarray) | 绝对值 |
np.sign(ndarray) | x的正负 |
np.square(ndarray) | x^2 |
np.sqrt(ndarray) | x^0.5 |
nan(NAN,Nan):not a number 表示不是一个数字,出现在数据有缺失,或者做了不合适的计算(不在函数定义域)的场合
import numpy as np
data = np.array([1.2,2.0,3.0,-1.0])
print(np.sin(data)) # [0.93203909,0.90929743,0.14112001,-0.84147098]
print(np.tan(data)) # [2.57215162,-2.18503986,-0.14254654,-1.55740772]
print(np.exp(data)) # [3.32011692,7.3890561,20.08553692,0.36787944]
print(np.abs(data)) # [1.2,2.,3.,1.]
print(np.sign(data)) # [1.,1.,1.,-1.]
print(np.square(data)) # [1.44,4.,9.,1.]
print(np.sqrt(data)) # [1.09544512,1.41421356,1.73205081,nan]
- Numpy向量的聚合
可使用min、max和sum进行最值、求和统计
可使用 mean 得到平均值、prod 得到所有元素乘积、std 得到标准差等import numpy as np data = np.array([1,2,3]) print(np.min(data)) print(np.max(data)) print(np.sum(data))
import numpy as np data = np.array([1,2,3]) print(np.mean(data)) # 求平均值 2.0 print(np.prod(data)) # 求所有元素乘积 6 print(np.std(data)) # 求标准差 0.816496580927726
- 二维数组(矩阵)的聚合
求矩阵元素的最值、总和等import numpy as np data = np.array([[1,2],[3,4],[5,6]]) print(np.max(data)) # 求矩阵元素最大值 6 print(np.min(data)) # 求矩阵元素最小值 1 print(np.sum(data)) # 求矩阵元素总和 21
import numpy as np data = np.array([[1,2],[5,3],[4,6]]) print(np.max(data,axis=0)) # 找出每一列最大值 print(np.max(data,axis=1)) # 找出每一行最大值
- 数组运算和广播机制
按位置运算(即对应元素进行加减乘除)
如果两个矩阵大小相同,我们可以使用算术运算符(+ - * /)对矩阵进行加、乘,NumPy将它们视为position-wise运算import numpy as np data = np.array([1,2]) ones = np.array([1,1]) # 对应元素的加减乘除 print("data+ones=",data+ones) print("data-ones=",data-ones) print("data*ones=",data*ones) print("data/ones=",data/ones) print("data*2=",data*2)
若两个矩阵大小不同,NumPy使用广播规则(broadcasting)执行算术运算,即:
I data 为3×2的数组,ones_row 为1×2的数组
II 相加时后者被扩充(内容重复填充)为3×2的数组
III 然后执行position-wise的加法 - 数组点乘
遵循矩阵乘法计算规则:np.dot(A,B)import numpy as np data = np.np.array([1,2,3]) powers_of_ten = np.array([1,100,10000]) print(np.dot(data,powers_of_ten))
- 矩阵相乘
遵循矩阵乘法计算规则:A@B,np.matmul(A,B)import numpy as np data1 = np.array([1,2,3],[4,5,6]) data2 = np.array([1,2],[3,4],[5,6]) print(np.matmul(data1,data2))
(2) 线性代数
- Numpy的线性代数
numpy.linalg模块可以应用于线性代数,求矩阵的行列式:np.linalg.det()import numpy as np A = np.array([[2.0,-1.0,0.0], [-1.0,2.0,-1.0], [0.0,-1.0,2.0]]) print(np.linalg.det(A)) # A的行列式 4.0
- 矩阵求逆
求矩阵的逆:np.linalg.inv()A = np.array([[2.0,-1.0,0.0], [-1.0,2.0,-1.0], [0.0,-1.0,2.0]]) A_inverse = np.linalg.inv(A) print(A_inverse) # A的逆矩阵 # output: [[0.75,0.5,0.25], [0.5,1.,0.5], [0.25,0.5,0.75]]
- 特征值
求矩阵的特征值:np.linalg.eig()A = np.array([[2.0,-1.0,0.0], [-1.0,2.0,-1.0], [0.0,-1.0,2.0]]) lam,v = np.linalg.eig(A) print(lam) # A的特征值 print(v) # A的特征向量 # output: [3.41421356,2.,0.58578644] [[-5.00000000e-01,-7.07106781e-01,5.00000000e-01], [7.07106781e-01,4.05405432e-16,7.07106781e-01], [-5.00000000e-01,7.07106781e-01,5.00000000e-01]]
- 线性方程组
求解线性方程:np.linalg.solve(A,b)A = np.array([[2.0,-1.0,0.0], [-1.0,2.0,-1.0], [0.0,-1.0,2.0]]) b = np.array([2.0,-1.0,3.0]) x = np.linalg.solve(A,b) # 求解Ax=b print(x) # output: [1.75,1.5,2.25]
四. 科学作图包Matplotlib
1. 什么是Matplotlib
- Python的绘图库,包含了大量的工具
- 可以创建各种图形,包括简单的散点图,正弦曲线,甚至是三维图形
- 在科学计算中,该包常被用于数据可视化
2. Matplotlib作图元素
(1) 数据曲线 (以正弦曲线为例)
import matplotlib.pyplot as plt
import numpy as np
X = np.linspace(0,2*np.pi,50)
Y = np.sin(X)
plt.plot(X,Y)
plt.show()
(2) 在一张图纸里绘制多条曲线
- 常见的颜色表示方式:
- ‘b’ 蓝色 ‘g’ 绿色 ‘r’ 红色 ‘y’ 黄色 ‘k’ 黑色 ‘w’ 白色
- 常见的点的表示方式:
- ‘.’ 点 ‘,’ 像素 ‘o’ 圆 ‘s’ 方形 ‘^’ 三角形
- 常见的线的表示方式:
- ‘-’ 直线 ‘–’ 虚线 ‘:’ 点线 ‘-.’ 点画线
import matplotlib.pyplot as plt import numpy as np X = np.linspace(0,2*np.pi,50) Y = np.sin(X) # y表示黄色,*表示星标的点,-表示实线 plt.plot(X,Y,'y*-') plt.plot(X,Y*2,'m--') plt.show()
(3)
- Matplotlib绘制的图形都在一个默认的figure中
- 可以自己创建figure,能控制图形大小等参数
- 这里创建一个figure,设置大小为(6,3)
# 创建一个figure,设置大小为(6,3) plt.figure(figsize=(6,3)) plt.plot(X,Y) plt.plot(X,Y*2) plt.show()
(4) 标题
- 直接通过 plt.title() 即可设置图形标题
plt.plot(X,Y) plt.plot(X,Y*2) plt.title("sin(X) & 2 sin(X)") plt.show()
(5) 坐标轴
- xlim和ylim:设定轴的范围
- xlabel和ylabel:设置轴的名称
- xticks和yticks:设置轴的刻度
plt.plot(X,Y) plt.plot(X,Y*2) plt.xlim((0,np.pi*2)) plt.ylim((-3,3)) plt.xlabel('X') plt.ylabel('Y') plt.xticks((0,np.pi*0.5,np.pi,np.pi*1.5,np.pi*2)) # 给出刻度坐标 plt.show()
(6) 标签(label)和图例(legend)
- 设置label和legend的目的是区分出每个数据对应的图形名称
plt.plot(X,Y,label="sin(x)") plt.plot(X,Y*2,label="2sin(x)") plt.legend(loc="best") # 显示label plt.show()
3. 综合应用案例
(1) 条形图/柱状图
import matplotlib.pyplot as plt
x = [1,2,3,4,5]
y = [3,6,1,8,2]
plt.bar(x,y,
width=0.3, # 柱子粗细
color='r', # 柱子颜色
alpha=0.3) # 不透明度,值越小越透明
plt.xticks(x,['a','b','c','d','e'])
plt.yticks(y)
plt.show()
(2) 散点图
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,2*np.pi,50)
y = np.sin(x)
plt.scatter(x,y,
color='r', # 点的填充颜色
marker='o', # 散点的形状
edgecolor='k') # 点的边缘颜色
plt.show()
(3) 散点上色图
import matplotlib.pyplot as plt
import numpy as np
# 生成500个坐标随机的数据点
k = 500
x = np.random.rand(k)
y = np.random.rand(k)
# 随机生成每个点的大小
size = 50 * np.random.rand(k)
# 根据各点坐标(x,y)对应的反正切分配颜色
color = np.arctan2(x,y)
# 画图并添加颜色栏 (colorbar)
plt.scatter(x,y,s=size,c=color)
plt.colorbar()
plt.show()