文章目录
- 前言
- 14.1 numpy的使用
- 14.1.1 数字运算
- 14.1.2 N维数组
- 14.1.3 矩阵运算与广播
- 14.1.4 元素访问
- 14.2 Matplotlib的使用
- 14.2.1 绘制简单图形
- 14.2.2 绘制复杂图形
- 14.2.3 显示图片
- 14.3 os函数
- 14.3.1 获取文件路径
- 14.3.2 路径的基本操作
- 14.4 tqdm的使用
- 14.4.1 tqdm的导入和使用
- 14.4.2 带有参数的`tqdm.tqdm()`
- 例1
- 例2
- 14.4.3 自定义进度条显示信息
- 14.4.4 tqdm内置生成可迭代对象方法
- 14.4.5 自定义方法更新进度
- 总结
前言
主要记录在python学习过程中遇到的一些问题。
14.1 numpy的使用
numpy包是人工智能算法的基础,本节简要介绍一下其包的使用。
14.1.1 数字运算
代码:
import numpy as np
## 生成数组
x = np.array([1.0, 2.0, 3.0])
print(x)
type(x)
## 算术运算
x = np.array([1.0, 2.0, 3.0])
y = np.array([5.0, 2.0, 3.0])
plus = x+y
print("plus", plus, "\n")
minus= x-y
print("minus", minus, "\n")
multiply = x*y
print("multiply", multiply, "\n")
devide = x/y
print("devide", devide, "\n")
输出:
[1. 2. 3.]
plus [6. 4. 6.]
minus [-4. 0. 0.]
multiply [5. 4. 9.]
devide [0.2 1. 1. ]
14.1.2 N维数组
代码:
import numpy as np
A = np.array([[1, 2], [3, 4]])
print(A)
print(A.shape)
print(A.dtype)
输出:
[[1 2]
[3 4]]
(2, 2)
int32
14.1.3 矩阵运算与广播
代码:
import numpy as np
## 矩阵运算
A = np.array([[1, 2], [3, 4]])
B = np.array([[3, 0],[0, 6]])
print("A+B", A+B, "\n")
print("A-B", A+B, "\n")
print("A*B", A*B, "\n")
print("A*10", A*10, "\n")
## 广播
# 不同维数的数组相乘
A = np.array([[1, 2], [3, 4]])
B = np.array([10, 20])
print("A*B,广播", A*B, "\n")
输出:
A+B [[ 4 2]
[ 3 10]]
A-B [[ 4 2]
[ 3 10]]
AB [[ 3 0]
[ 0 24]]
A10 [[10 20]
[30 40]]
A*B,广播 [[10 40]
[30 80]]
14.1.4 元素访问
代码:
import numpy as np
# 元素的索引从0开始
X = np.array([[51, 55], [14, 19], [0, 4]])
print(X)
print("X[0]", X[0]) # 第0行
print("X[0][1]", X[0][1]) # (0,1)的元素
# 用for语句访问元素
X = np.array([[51, 55], [14, 19], [0, 4]])
for row in X:
print(row)
# 使用数组访问元素
X = np.array([[51, 55], [14, 19], [0, 4]])
X = X.flatten()
print("X[np.array([0, 2, 4])]", X[np.array([0, 2, 4])])# 获取索引为0、2、4的元素
print(X)
# 获取满足一定条件的元素
X = np.array([[51, 55], [14, 19], [0, 4]])
X = X.flatten()
print("X > 15", X > 15)
print("X[X>15]", X[X>15])
输出:
[[51 55]
[14 19]
[ 0 4]]
X[0] [51 55]
X[0][1] 55
[51 55]
[14 19]
[0 4]
X[np.array([0, 2, 4])] [51 14 0]
[51 55 14 19 0 4]
X > 15 [ True True False True False False]
X[X>15] [51 55 19]
14.2 Matplotlib的使用
Matplotlib为python的一个包,可用于一些图形的绘制,具体实例如下。
14.2.1 绘制简单图形
代码:
import numpy as np
import matplotlib.pyplot as plt
# 生成数据
x = np.arange(0, 6, 0.1) # 以0.1为单位,生成0到6的数据
y = np.sin(x)
# 绘制图形
plt.plot(x, y)
plt.show()
输出:
14.2.2 绘制复杂图形
代码:
import matplotlib.pyplot as plt
# 生成数据
x = np.arange(0, 6, 0.1) # 以0.1为单位,生成0到6的数据
y1 = np.sin(x)
y2 = np.cos(x)
# 绘制图形
plt.plot(x, y1, label="sin")# sin系列标签
plt.plot(x, y2, linestyle = "--", label="cos") # 用虚线绘制,cos系列标签
plt.xlabel("x") # x轴标签
plt.ylabel("y") # y轴标签
plt.title('sin & cos') # 标题
plt.legend()# 显示系列标签
plt.show()
输出:
14.2.3 显示图片
代码:
from matplotlib.image import imread
img = imread('字符串驻留.PNG') # 读入图像(设定合适的路径!)
plt.imshow(img)
plt.show()
输出:
14.3 os函数
os用于操作文件目录,本节将对其操作进行一个简要介绍。
14.3.1 获取文件路径
导入os.path函数后进行相关的操作。
文件组成:
代码:
import os.path
print(os.path.abspath('document_try/neu.jpg'))#获取文件的绝对路径
print(os.path.exists('document_try/neu.jpg'))#判断文件目录是否存在,存在返回True,不存在返回False
print(os.path.abspath('document_try/兰州交通大学.PNG'))#获取文件的绝对路径
print(os.path.exists('document_try/兰州交通大学.PNG'))#判断文件目录是否存在,存在返回True,不存在返回False
输出:
D:\document\document\major_study\Natural Language Processing\自然语言处理:基于预训练模型的方法(实践与笔记)\chp4\13文件练习\bneu.jpg
False
D:\document\document\major_study\Natural Language Processing\自然语言处理:基于预训练模型的方法(实践与笔记)\chp4\document_try\兰州交通大学.PNG
True
14.3.2 路径的基本操作
导入os.path函数后进行相关的操作,不改变实际文件路径的关系,只是在给定的路径字符串中进行相关操作。
import os.path
print(os.path.join('document_try','document_try2'))#将目录与目录或文件名拼接起来
print(os.path.split('\document_try\兰州交通大学.PNG'))#分离目录名与文件名
print(os.path.splitext('document_try/兰州交通大学.PNG'))#分离文件名与扩展名
print(os.path.basename('D:\document\document\major_study\python 学习/13文件练习/bneu.jpg'))#从一个目录中提取文件名
print(os.path.dirname('D:\document\document\major_study\python 学习/13文件练习/bneu.jpg'))#从一个路径中提取文件路径,不包含文件名
print(os.path.isdir('D:\document\document\major_study\python 学习/13文件练习/bneu.jpg'))#判断是否为路径
输出:
document_try\document_try2
(‘\document_try’, ‘兰州交通大学.PNG’)
(‘document_try/兰州交通大学’, ‘.PNG’)
bneu.jpg
D:\document\document\major_study\python 学习/13文件练习
False
14.4 tqdm的使用
参考资料:tqdm的使用和例子
作用: 在使用Python处理比较耗时操作的时候,为了便于观察处理进度,这时候就需要通过进度条将处理情况进行可视化展示,以便我们能够及时了解情况。
优点:tqdm就能非常完美的支持和解决这些问题,可以实时输出处理进度而且占用的CPU资源非常少,支持windows、Linux、mac等系统,支持①循环处理、②多进程、③递归处理、还可以结合Linux的命令来查看处理情况,等进度展示。
14.4.1 tqdm的导入和使用
可以通过import导入tqdm包,有如下2种所示的代码导入方式,建议使用方法1,因为方法1导入的是一个lib,而方法2导入的是tqdm.tqdm方法,使用方法2导入就没办法使用tqdm.trange()等其他方法了。
对于可以迭代的对象都可以使用tqdm进行封装实现可视化进度,使用如下文代码所示。
代码
# 导入包
import tqdm # 方法1
# from tqdm import tqdm # 方法2
import time
# 定义一个可迭代对象
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 正常的遍历(没有进度条)
for idx, element in enumerate(a):
print(f"No.{idx}: {element}")
# 使用tqdm对可迭代对象进行包装,实现进度条可视化
for idx, element in enumerate(tqdm.tqdm(a)):
time.sleep(0.5)
print(f"No.{idx}: {element}")
输出
No.0: 1
No.1: 2
No.2: 3
No.3: 4
No.4: 5
No.5: 6
No.6: 7
No.7: 8
No.8: 9
No.9: 10
10%|█ | 1/10 [00:01<00:09, 1.01s/it]No.0: 1
No.1: 2
30%|███ | 3/10 [00:03<00:07, 1.01s/it]No.2: 3
No.3: 4
50%|█████ | 5/10 [00:05<00:05, 1.01s/it]No.4: 5
60%|██████ | 6/10 [00:06<00:04, 1.01s/it]No.5: 6
No.6: 7
80%|████████ | 8/10 [00:08<00:02, 1.01s/it]No.7: 8
No.8: 9
100%|██████████| 10/10 [00:10<00:00, 1.01s/it]
No.9: 10
可以看出输出进度条会不停地输出一行,直至输出所有结果,这是因为每次的print内容都不一样,为了能够显示新的内容,所以会这样。下文所示程序因为没有控制台输出,所以进度条就只有一条。
代码:
# 定义一个可迭代对象
a = [1, 4, 7, 2, 5, 8, 3, 6, 9, 10]
# 使用tqdm对可迭代对象进行包装,实现进度条可视化
for idx, element in enumerate(tqdm.tqdm(a)):
time.sleep(0.5)
输出:
14.4.2 带有参数的tqdm.tqdm()
在进度条中加一些属于自己的信息。
@staticmethod
def format_meter(n, total, elapsed, ncols=None, prefix='', ascii=False, unit='it',
unit_scale=False, rate=None, bar_format=None, postfix=None,
unit_divisor=1000, initial=0, colour=None, **extra_kwargs):
iterable
: 可迭代的对象, 在⼿动更新时不需要进⾏设置desc
: 字符串, 左边进度条描述⽂字total
: 总的项⽬数leave
: bool值, 迭代完成后是否保留进度条file
: 输出指向位置, 默认是终端, ⼀般不需要设置ncols
: 调整进度条宽度, 默认是根据环境⾃动调节长度, 如果设置为0, 就没有进度条, 只有输出的信息unit
: 描述处理项⽬单位的⽂字, 默认是it, 例如: 100 it/s, 处理照⽚的话设置为img ,则为 100 img/sunit_scale
: ⾃动根据国际标准进⾏项⽬处理速度单位的换算, 例如 100000 it/s >> 100k it/scolour
: 进度条颜色
例1
代码:
import tqdm
import time
d = {'测试集比例':0.1,'训练集比例':0.8}
"""desc设置名称
ncols设置进度条长度 -> 建议设置在100以内
postfix以字典形式传入详细信息
"""
for i in tqdm.tqdm(range(50),desc='训练过程进度',ncols=100,postfix=d):
time.sleep(0.1)
输出:
例2
代码:
import tqdm
import time
d = {'测试集比例':0.1,'训练集比例':0.8}
"""desc设置名称
ncols设置进度条长度 -> 建议设置在100以内
postfix以字典形式传入详细信息
"""
for i in tqdm.tqdm(range(50),desc='训练过程进度',ncols=100,postfix=d):
time.sleep(0.1)
输出:
14.4.3 自定义进度条显示信息
在进度条中动态输出一些信息,可以使用set_description()
,set_postfix()
方法,set_description()
在进度条之前显示,set_postfix()
在进度条之后显示。
代码:
import tqdm
import time
import random
# 在使用set_description时一般会创建一个tqdm.tqdm()对象
pbar = tqdm.tqdm(["a", "b", "c", "d", "e", "f", "g"])
for idx, element in enumerate(pbar):
time.sleep(0.2)
pbar.set_description(f"No.{idx}: {element}")
# 在使用set_description()和set_postfix()时一般会创建一个tqdm.tqdm()对象
epochs = 150
pbar = tqdm.tqdm(range(epochs), ncols=100) # ncols设置进度条显示的字符长度,小了就显示不全了
for idx, element in enumerate(pbar):
time.sleep(0.01)
pbar.set_description(f"Epoch {idx}/{epochs}")
pbar.set_postfix({"class": element}, loss=random.random(), cost_time = random.randrange(0, 100))
输出:
注:
set_description
和set_postfix
都用的kwargs传参,所以我们可以:
- 用字典传参 ->
pbar.set_postfix({"key_1": "value_1", ...})
- 直接用关键字传参 ->
pbar.set_postfix(key_1 = value_1, key_2 = value_2, ...)
- 混着用 ->
pbar.set_postfix({"key_1": value_1, "key_2": value_2, ...}, key_3 = value_3, ...)
14.4.4 tqdm内置生成可迭代对象方法
除了tqdm.tqdm(range(xxx))
这样的写法外,tqdm也提供了类似的方法,即tqdm.trange(xxx)
,代码如下:
import tqdm
import time
pbar = tqdm.trange(200, 400, 2)
for idx, element in enumerate(pbar):
time.sleep(0.1)
pbar.set_description(f"No.{idx} -> {element}")
输出:
14.4.5 自定义方法更新进度
有时候我们不仅仅是通过一个for训练来更新进度条,我们也希望在做完某些操作后更新一次进度条,代码如下:
import tqdm
import time
with tqdm.tqdm(total=10) as bar: # total为进度条总的迭代次数
# 操作1
time.sleep(1)
# 更新进度条
bar.update(3) # bar.update()里面的数表示更新的次数,和optimizer.step方法类似
# 操作2
time.sleep(3)
# 更新进度条
bar.update(1)
# 操作3
time.sleep(1)
# 更新进度条
bar.update(6) # 建议不要超过total
输出:
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。