day19学习numpy库和matplotlib库
文章目录
- 一、NumPy库
- 11.数组操作
- 11.5分割数组
- 11.6矩阵运算
- 11.6.1**np.dot**点乘
- 11.6.2**np.matmul**矩阵乘法
- 11.6.3 **np.linalg.det**矩阵行列式
- 12.数组元素的增删改查
- 12.1 **resize**
- 12.2 append添加
- 12.3 insert插入
- 12.4 delet删除
- 12.5 argwhere和 where
- 12.6 argmax
- 12.7 unique去重
- 13.统计函数
- 13.1 amin和amax
- 13.2 ptp最值之差
- 13.3median
- 13.4mean()
- 13.5 average()加权平均值
- 13.6 var( )方差
- 13.7std( )方法
- 二、Matplotlib库
- 1.下载
- 2.常用函数使用
- 2.1 plot函数
- 2.2 figure函数
- 3.处理中文标题乱码
- 3.1局部修改
- 3.2修改配置文件
一、NumPy库
11.数组操作
11.5分割数组
函数名称 | 参数 | 说明 |
---|---|---|
hsplit(ary, indices_or_sections) | ary:原数组 indices_or_sections:按列分割的索引位置 | 将一个数组水平分割为多个子数组(按列) |
vsplit(ary, indices_or_sections) | ary:原数组 indices_or_sections:按行分割的索引位置 | 将一个数组垂直分割为多个子数组(按行) |
- hsplit水平分割:从左往右 画垂直线分割
- 示例:
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 使用 np.hsplit 将数组分割成三个子数组
# 分割点在索引1和2处,这意味着:
# 第一个子数组将包含从第0列到索引1(不包括索引1)的列,即第0列。
# 第二个子数组将包含从索引1(包括索引1)到索引2(不包括索引2)的列,即第1列
# 第三个子数组将包含从索引2(包括索引2)到末尾的列,即第2列
L = np.hsplit(a, [1,2]) # 分为 【0~1列)【1~2) 【2~全部】
print(L[0]) # 输出 [[1] [4] [7]]
print(L[1]) # 输出 [[2] [5] [8]]
print(L[2]) # 输出 [[3] [6] [9]]
- vsplit垂直分割:从上往下 画水平线分割
- 示例:
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
L = np.vsplit(a, [1, 2])
# 原理同上,划分3个矩阵:【0~1行)【1~2) 【2~全部】
print(L[0]) # 输出 [[1 2 3]]
print(L[1]) # 输出 [[4 5 6]]
print(L[2]) # 输出 [[7 8 9]]
11.6矩阵运算
11.6.1np.dot点乘
是一个通用的点积函数,适用于多种维度的数组。
- 对于二维数组(矩阵),
np.dot
等价于矩阵乘法。 - 对于一维数组(向量),
np.dot
计算的是向量的点积(内积)。 - 示例:
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
#[1 2] [5 6]
#[3 4] [7 8]
result = np.dot(a, b)
print(result) # 输出
#[[19 22] 原理 [[1*5+2*7 1*6+2*8]
# [43 50]] [3*5+4*7 3*6+4*8]]
11.6.2np.matmul矩阵乘法
是专门用于矩阵乘法的函数,适用于二维及更高维度的数组
-
计算:行乘列
-
示例:
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
#[1 2] [5 6]
#[3 4] [7 8]
result = np.matmul(a, b)
print(result)
- 输出 — 与上面dot的计算过程一样
[[19 22]
[43 50]]
11.6.3 np.linalg.det矩阵行列式
计算一个方阵(行数和列数相等的矩阵)的行列式。
-
计算:正对角线相乘 - 负对角线相乘
-
示例:
import numpy as np a = np.array([[1, 2], [3, 4]]) #[ 1 2 ] #[ 3 4 ] print(np.linalg.det(a)) # 计算: 1*4 - 2*3 # 输出 -2.0000000000000004
-
结果不是-2,这是由于浮点数的二进制表示和计算过程中的舍入误差导致的。可以通过四舍五入来近似表示:
a = np.round(np.linalg.det(a)) print(a) # 输出 -2.0
12.数组元素的增删改查
12.1 resize
变化数组形状,并且不受数组个数影响
-
修改原理:重复遍历原数组,填充新形状数组
-
语法:np.resize( arr, (n,m) )
-
效果:把arr数组转化为 n行 m列的数组
-
示例:
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.resize(a, (3,3))
#[1 2] [1 2 3]
#[3 4] -> [4 1 2]
# [3 4 1]
print(b)
- 输出:
[[1 2 3]
[4 1 2]
[3 4 1]]
12.2 append添加
-
语法:np.append( arr, value, axis = None)
-
参数:
-
arr : 数组 ; value : 添加的值
-
axis = None / 0 / 1
- None :平铺成一维数组末尾追加并返回
- 0 / 1 :进行 行 或 列 的相加
-
注意:
行相同,才能列相加(axis=1);列相同,才能行相加(axis=0)
-
示例:
import numpy as np a = np.array([[1, 2], [3, 4], [5, 6]]) # 形状(3,2) value1 = np.array([[8], [9], [0]]) # 形状(3,1) # a 和 value1 行相同,才能列相加 # (3,2) + (3,1) = (3,3) b = np.append(a, value1, axis=1) value2 = np.array([[8, 9]]) # 形状(1,2) # a 和 value1 列相同,才能行相加 # (3,2) + (1,2) = (4,2) c = np.append(a, value2, axis=0) print(b) print(c)
-
输出:
[[1 2 8] [3 4 9] [5 6 0]] [[1 2] [3 4] [5 6] [8 9]]
12.3 insert插入
- 语法:np.insert ( arr, value, axis = None)
- 参数:
- arr : 数组 obj:插入的位置 value : 添加的值
- axis = None / 0 / 1
- None :平铺成一维数组末尾追加并返回
- 0 / 1 :进行 行 或 列 的插入
- 注意:
进行a维度的插入时,其他维度的大小要相同才可
- 示例:
import numpy as np
a = np.arange(8).reshape(2,4)
#[0 1 2 3]
#[4 5 6 7]
# 插入行数据 此时 a的形状 (2,4)
insert_h1 = np.insert(a,2,[8,9,10,11],axis=0)
# 第三行插入 [8,9,10,11]
print(insert_h1)
# 输出
#[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
# 插入列数据 此时 a的形状 (2,4)
# 在第2列插入 全0 等价于插入 [0,0]
insert_v1 = np.insert(a,2,0,axis=1)
print(insert_v1)
# 输出
#[[0 1 0 2 3]
# [4 5 0 6 7]]
12.4 delet删除
- 语法:np.delete( arr, value, axis = None)
- 参数:
- arr : 数组 ; value : 删除的索引
- axis = None / 0 / 1
- None :平铺成一维数组末尾删除并返回
- 0 / 1 :删除 行 或 列
- 示例:
# 一维数组
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
# 删除索引为 2 和 4 的元素
new_arr = np.delete(arr, [2, 4])
print(new_arr) # [1 2 4 6]
# 二维数组
import numpy as np
a = np.arange(6).reshape(2,3)
#[0 1 2]
#[3 4 5]
# 删除第1行
delet_h = np.delete(a, 0, axis=0)
print(delet_h) # 输出 [[3 4 5]]
# 删除第列行
delet_v = np.delete(a, 0, axis=1)
print(delet_v) # 输出 [[1 2] [4 5]]
12.5 argwhere和 where
-
相同点:
- 都可以返回数组中非 0 元素的索引,若是多维数组则返回行、列索引组成的索引坐标
- 可以传布尔表达式,返回true的下标索引
-
不同点:
- 前者返回一个列表,列表中装了每一个点的索引[a b]
- 后者返回一个元组b,里面装两个数组,分别装行和列的索引
- 好处:arr = a[ b[0], b[1] ] 高级索引获取所有值
-
示例:
import numpy as np
a = np.arange(6).reshape(2,3)
print(a)
print(np.argwhere(a))
print("大于4的索引:", np.argwhere(a > 4))
- 输出
[[0 1 2]
[3 4 5]]
[[0 1] # 1
[0 2] # 2
[1 0] # 3
[1 1] # 4
[1 2]] # 5
大于4的索引: [[1 2]] # 5
12.6 argmax
获取列表中最大值的下标索引
- 示例:
import numpy as np
a = np.arange(6).reshape(2,3)
print(np.argmax(a))
# 输出 5 # 这里最大值5的索引是5
12.7 unique去重
函数名称 | 参数 | 说明 |
---|---|---|
unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None) | ar:输入的数组 return_index:如果为 True,则返回新数组元素在原数组中的位置(索引) return_inverse:如果为 True,则返回原数组元素在新数组中的位置(逆索引) return_counts:如果为 True,则返回去重后的数组元素在原数组中出现的次数 | 删掉某个轴上的子数组,并返回删除后的新数组 |
-
axis = 0 / 1 去除重复的 行 或 列
-
示例:
import numpy as np arr = np.array([[1, 2], [2, 3], [1, 2]]) # 去除重复的行 print(np.unique(arr,axis=0)) # 输出 #[[1 2] # [2 3]]
13.统计函数
13.1 amin和amax
- 作用:查找最大和最小值
- 语法:np.amin( arr, axis=0 / 1 )
- axis=0 : 就是每一列返回一个最大值**(比较每一列中最大的行)**
- axis=1 : 就是每一行返回一个最大值**(比较每一行中最大的列)**
- 示例:
import numpy as np
arr = np.array([[1,23,4,5,6],[1,2,333,4,5]])
#[1 23 4 5 6]
#[1 2 333 4 5]
# 最小的行
print(np.amin(arr,axis=0)) # 输出[1 2 4 4 5]
# 最大的列
print(np.amax(arr,axis=1)) # 输出[23 333]
13.2 ptp最值之差
-
计算数组元素中最值之差,即最大值 - 最小值
-
axis = 0:每一列返回一个值(每一列的最大行和最小行相减)
-
axis = 1:每一行返回一个值(每一行的最大列和最小列相减)
-
示例:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
#[1 2 3]
#[4 5 6]
#[7 8 9]
print(np.ptp(arr,axis=0)) # 输出:[6 6 6]
# 原理:[7-1 8-2 9-3]
print(np.ptp(arr,axis=1)) # 输出:[2 2 2]
# 原理:[3-1 6-4 9-7]
13.3median
计算中位数,中位数是指将数组中的数据按从小到大的顺序排列后,位于中间位置的值。如果数组的长度是偶数,则中位数是中间两个数的平均值。
- axis=0 : 返回每一行的中位数 ,列同理
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 使用 np.median 计算中位数
median_value = np.median(arr,axis=0)
print(median_value)
# 输出:
# [2. 5.]
13.4mean()
沿指定的轴,计算数组中元素的算术平均值(即元素之总和除以元素数量)
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 使用 np.mean 计算平均值
mean_value = np.mean(arr)
print(mean_value)
# 输出:
# 3.5
# 使用 np.mean 按行计算平均值
mean_values_row = np.mean(arr, axis=1)
# 使用 np.mean 按列计算平均值
mean_values_col = np.mean(arr, axis=0)
print(mean_values_row)
# 输出:
# [2. 5.]
print(mean_values_col)
# 输出:
# [2.5 3.5 4.5]
13.5 average()加权平均值
加权平均值是将数组中各数值乘以相应的权数,然后再对权重值求总和,最后以权重的总和除以总的单位数(即因子个数);根据在数组中给出的权重,计算数组元素的加权平均值。该函数可以接受一个轴参数 axis,如果未指定,则数组被展开为一维数组。
加权平均值
=
∑
i
=
1
n
(
x
i
⋅
w
i
)
∑
i
=
1
n
w
i
加权平均值=\dfrac{∑_{i=1}^n(x_i⋅w_i)}{∑_{i=1}^nw_i}
加权平均值=∑i=1nwi∑i=1n(xi⋅wi)
其中 xi是数组中的元素,wi是对应的权重。
如果所有元素的权重之和等于1,则表示为数学中的期望值。
# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5])
# 创建权重数组
weights = np.array([0.1, 0.2, 0.3, 0.2, 0.2])
# 使用 np.average 计算加权平均值
average_value = np.average(arr, weights=weights)
print(average_value)
# 输出:
# 3.2
13.6 var( )方差
np.var 函数默认计算的是总体方差(Population Variance),而不是样本方差(Sample Variance)。
总体方差:
对于一个总体数据集 X={x1,x2,…,xN},总体方差的计算公式为:
σ
2
=
1
N
∑
i
=
1
N
(
x
i
−
μ
)
2
σ^2=\dfrac{1}{N}∑_{i=1}^N(x_i−μ)^2
σ2=N1i=1∑N(xi−μ)2
其中:
- N是总体数据点的总数。
- μ是总体的均值。
# 创建一个数组
arr = np.array([1, 2, 3, 4, 5])
# 计算方差
variance = np.var(arr)
# 使用样本方差计算
# variance = np.var(arr, ddof=1)
print(variance)
#输出:2
样本方差:
对于一个样本数据集 X={x1,x2,…,xn},样本方差 的计算公式为:
s
2
=
1
n
−
1
∑
i
=
1
n
(
x
i
−
x
‾
)
2
s^2=\dfrac{1}{n−1}∑_{i=1}^n(x_i−\overline x)^2
s2=n−11i=1∑n(xi−x)2
13.7std( )方法
标准差是方差的算术平方根,用来描述一组数据平均值的分散程度。若一组数据的标准差较大,说明大部分的数值和其平均值之间差异较大;若标准差较小,则代表这组数值比较接近平均值
# 创建一个数组
arr = np.array([1, 2, 3, 4, 5])
# 计算标准差 = 方差开根号
std_dev = np.std(arr)
print(std_dev)
# 输出:1.4142135623730951
二、Matplotlib库
1.下载
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple/
2.常用函数使用
2.1 plot函数
import numpy as np
import matplotlib.pyplot as plt
def test01():
# 生产数据
x = np.linspace(-6, 6, 100)
# 定义函数
y1 = np.sin(x)
y2 = np.cos(x)
# 绘制折线图
plt.plot(x, y1, 'b')
plt.plot(x, y2, 'g')
# 显示图
plt.show()
test01()
- 画图如下:
2.2 figure函数
def test02():
x = np.linspace(-6, 6, 100)
# 定义函数
y1 = x ** 2
# 创建画布 -设置大小
fig = plt.figure(figsize=(8, 6))
# 创建绘图区域
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
# 绘制折线图
ax.plot(x, y1, 'b', label='y=x^2')
# 加载图例(图片左下角的图标)
ax.legend()
plt.show()
- 输出图
3.处理中文标题乱码
3.1局部修改
添加如下代码即可
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
3.2修改配置文件
执行如下代码,找到配置文件matplotlibrc
import matplotlib
print(matplotlib.matplotlib_fname())
修改1:
修改2:
修改3:
4.subplot 和 subplots 函数
-
共同的:都是为了在一个画布上,划分多个区域,分别画图
-
不同点:前者是每次画之前调用fig.add_subplot(1,2,1);后者是一次划分好区域,返回一个列表,并且自己就可以创建好画布
-
subplot 示例:
x = np.linspace(-6, 6, 100)
# 定义函数
y1 = x ** 2
y2 = np.tan(x)
# ------------从这里开始不一样--------------------
# 创建画布 -设置大小
fig = plt.figure(figsize=(8, 6))
# 创建绘图区域
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
# 分区------subplot 方法---------
# 在每次plot画图之前,设置画在哪
# 1 行 2 列 的 第1个位置
ax = fig.add_subplot(1,2,1)
# 绘制折线图
ax.plot(x, y1, 'b', label='y=x**2')
# 分区------subplot 方法-----------
ax = fig.add_subplot(1,2,2)
ax.plot(x, y2, 'g', label='y=tan(x)')
# 加载标签
ax.legend()
#---------------上面不一样------------
plt.show()
- subplots 示例
x = np.linspace(-6, 6, 100)
# 定义函数
y1 = x ** 2
y2 = np.tan(x)
# 创建图形和子图
fig, axs = plt.subplots(1, 2, figsize=(8, 6))
# 图形1
axs[0].plot(x, y1, label='y=x**2')
axs[0].legend()
# 图形2
axs[1].plot(x, y2, label='y=tan(x)')
axs[1].legend()
plt.show()
- 输出一样的图片: