引言:
数据可视化即是将计算出的结果以图表等形式展现出来,使结果更加直观,并广泛被运用在数学建模的过程中:
· NumPy库负责组织,计算数据;
· Matplotlib库负责展示数据;
NumPy库:
操作对象 ------ N维数组:
ndarry的基本元素性质:
·轴(axes):数组的维度;
· 秩(rank):数组的维数;
· 大小(size):数组的元素个数;
· 形状(shape):x行y列;
· 类型(dtype):数组中元素的类型;
· 元素大小(itemsize):数组中元素所占的字节大小;
数组的创建:
|-------------------------------------|-------------------------------------------------------------------|
| 函数 | 作用 |
| np. array([x, y, z], dtype = int) | 基于列表与元组创建一个初始化数组 |
| np. arange(x, y, i ) | 创建一个包含从x开始,到y结束(不包括y),步长为i的元素组成的数组。其中例如:np. arange(50)为包括0~49的元素 |
| np. linspace(x, y, n) | 创建一个从x到y,等分为n个元素的数组。 |
| np. full( (m, n), fillvalue) | 创建一个m行n列,元素全为fillvalue的数组。 |
| np. ones( (m, n), dtype) | 创建一个m行n列,元素全为1的数组 |
| np. zeros( (m, n), dtype) | 创建一个m行n列,元素全为0的数组 |
| np. eye(n) | 创建一个n行n列,对角线为1,其余元素均为0的对角阵 |
| np. random. rand(m, n) | 创建一个m行n列的随机数组 |
数组对象的常见操作:
数组之间的运算:
对应位置相运算:

数组和普通值之间的运算:

ndarray的基本索引与切片:
import numpy as np
a = np.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]
]
])
##输出0层0行0列的元素
print(a[0][0][0]) ##或者写成a[0, 0, 0]
##输出每一层的0行0列元素:
print(a[:, 0, 0])
##输出第一层的矩阵:
print(a[0, :, :]) ##或输出a[0]
结果:
0
[ 0 12]
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
array的形态变换操作:
1,reshape函数:
reshape函数改变数组的形状,不改变原数组的内容:
import numpy as np
a = np.arange(12)
print(a.reshape(2, 6))
print("-------------")
print(a.reshape(6, 2))
结果为:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]]
-------------
[[ 0 1]
[ 2 3]
[ 4 5]
[ 6 7]
[ 8 9]
[10 11]]
2,resize函数:
resize函数会直接将原数组变为指定的形状,并返回一个空值(注意)。
提示:
resize()方法要求数组拥有自己的数据,若执行的对象是reshape后的结果,由于reshape方法返回的是原数据的一个视图,并不具备对该数据的修改权限,故执行后会报错。
import numpy as np
a = np.arange(12)
a.resize((2, 3))
print(a)
结果为:
[[0 1 2]
[3 4 5]]
3,transpose(*axes)函数可以得到该矩阵的转置矩阵。
import numpy as np
a = np.arange(12).reshape((3, 4))
b = a.transpose()
b
结果为:
array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])
4,flatten函数:
用来将高维数组展平成一维数组:
import numpy as np
a = np.arange(12).reshape((3, 4))
b = a.flatten()
b
结果为:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
ndarray常用的统计方法:
## axis = 0,表示按列方向; axis = 1, 表示按行方向
|---------------------|-------------------------------|
| 函数 | 作用 |
| sum() | 按指定轴返回数组元素的和,未指定axis,即范围是全体元素 |
| mean() | 按指定轴返回数组元素的均值 |
| max() / min() | 按指定轴返回数组元素的最值 |
| std() | 按指定轴返回数组元素的标准差 |
| argmin() / argmax() | 按指定轴返回数组元素中最值元素的对应索引组成的数组 |
| cumsum() | 按指定轴返回数组元素的累和 |
| cumprod() | 按指定轴返回数组元素的累积 |
import numpy as np
a = np.arange(2, 20).reshape(6, 3)
print(a.sum())
print(a.sum(axis = 1))
print(a.argmin(axis = 1))
print(a.std(axis = 1))
结果为:
189
[ 9 18 27 36 45 54]
[0 0 0 0 0 0]
[0.81649658 0.81649658 0.81649658 0.81649658 0.81649658 0.81649658]
numpy的专门应用:
线性代数方面的应用:
linalg常用函数:
|-------------------|------------------|
| 函数 | 作用 |
| linalg. det() | 计算行列式 |
| linalg. inv() | 计算逆矩阵 |
| linalg. solve() | 多元一次方程组求根 |
| linalg. eig() | 返回由特征值和特征向量构成的元组 |
| linalg. eigvals() | 计算特征值 |
| linalg. svd() | 矩阵的奇异值分解 |
| linalg. pinv() | 广义逆矩阵 |
import numpy as np
a = np.arange(1, 5).reshape((2, 2))
## -------- 矩阵内积, 矩阵乘法:
b = np.arange(2, 6).reshape(2, 2)
c = a.dot(b) ##点乘
## -----计算行列式
d1 = np.linalg.det(a)
## -----求逆矩阵
d2 = np.linalg.inv(a)
## ----- 多元一次方程求根-----------

import numpy as np
a = np.array([
[1, 1],
[2, 4]
]) ## 方程组的系数矩阵
b = np.array([35, 94]) ##方程组右侧的常数矩阵
x = np.linalg.solve(a, b) ##solve函数返回方程组的解
## ------ 求特征值与特征向量的元组
import numpy as np
a = np.array([
[1, 1],
[2, 4]
])
b = np.linalg.eig(a)
b
结果为:
EigResult(eigenvalues=array([0.43844719, 4.56155281]), eigenvectors=array([[-0.87192821, -0.27032301],
[ 0.48963374, -0.96276969]]))
多项式方面的应用:
|-----------------------------------|----------------------------------|
| 函数 | 作用 |
| poly1d (A ) | 利用系数数组A生成多项式 |
| polyval (p, k) | 求多项式p,在x = k时的值 |
| ployder(0, m = 1) | 求多项式p的m阶导数, m默认为1 |
| polyint(p, m = 1) | 求多项式p的m重积分, m默认为1 |
| polyadd(p1, p2) / polysub(p1, p2) | 多项式求和,差 |
| polymul(p1, p2) / polydiv(p1, p2) | 多项式作乘除 |
| polyfit(x, y, k) | 多项式拟合,x,y为要拟合的两组数据,k为拟合多项式中的最高次幂 |
import numpy as np
#针对f(x) = x^3 - 2x + 1
a = np.array([1, 1, -2, 1]) ##最后一项为常数项系数,逐个往前推,缺失的项系数用0代替
f = np.poly1d(a)
print(f)
结果为:
3 2
1 x + 1 x - 2 x + 1
#相当于分别将值代入多项式求解
f(1)
>>1
f(2)
>>9
#也可以通过polyval(f, k)求解:
np. polyval(f, 1)
>>1
数组的文件输入与输出:
numpy中常用的文件读写函数:
1,numpy. savetext( fname, x, fmt = ' %. 18e', delimiter = ' ')
------------将数组写入一个指定的文件中
参数说明:
fname:文件名;
x: 将要被写入的数组;
fmt:格式字符串
delimiter:分隔符,缺省时为空格
import numpy as np
data = np.arange(50).reshape(5, 10)
np.savetxt("D:\\python_dailywork\\test.txt", data, fmt = '%d', delimiter = ',')
##注意粘贴的文件地址要避免转义
2,numpy. loadtxt(fname, dtye = np.float, delimeter = None)
------------从指定文本文件中读取数据,并返回一个数组
参数说明:
fname:文件名;
dtype: 文件中读入的数据以什么类型返回,默认为np.float类型
delimiter: 分隔符,缺省时为空
import numpy as np
a = np.loadtxt('D:\\python_dailywork\\test.txt', dtype = int, delimiter = ',' )
Matplotlib库:
Matplotlib主要提供了两个便捷的绘图子模块:
· pyplot:通过简单的绘图函数实现不同的绘图功能;
· pylab:两者用法相似
pyplot绘图函数的使用:
plot(x, y, s, linewidth)
------------------在二维坐标系中绘制直线,曲线或离散点,返回一个列表对象
x: 横坐标的取值范围,省略时, 默认采用y数据集的索引作为x
y:与x相对应的纵坐标取值范围
(x, y实质是两个一维数组)
s: 控制线型的格式字符串,可省略
linewidth: 线的宽度
------------------------------------------------------------------
例一:输入一个列表
##
当plt.plot只传入一个列表时,会将列表元素作为y轴的值,而x轴的值默认从0开始,即
[0, 1,2];
故绘制连接的是三个点:(0, 1)(1, 2)(2, 3)
##
import matplotlib. pyplotas plt
plt.plot([1, 2, 3])
plt.show()
------------------------------------------
例二:给定三个参数:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
x = np.linspace(0, 10, 100)
##生成一个包含100个元素的一维数组,这些元素在(0, 10)均匀分布
y = np.sin(x)
plt.plot(x, y)
plt.show()
例二:
各种风格字符:
颜色字符:
|----|----|
| 字符 | 含义 |
| r | 红 |
| g | 绿 |
| b | 蓝 |
| y | 黄 |
| k | 黑 |
| w | 白 |
| c | 蓝绿 |
| m | 品红 |
点风格字符:
|----|-------|----|--------|
| 符号 | 意义 | 符号 | 意义 |
| , | 极小实心点 | s | 正方形 |
| . | 小实心点 | p | 正五边形 |
| o | 大实心点 | h | 垂直正六边形 |
| v | 倒三角 | H | 水平正六边形 |
| ^ | 上三角 | + | 十字 |
| > | 右三角 | x | 叉号 |
| < | 左三角 | d | 菱形 |
线风格字符:
|------|-----|
| 符号 | 意义 |
| - | 实线 |
| -- | 破折线 |
| : | 虚线 |
| -. | 点横线 |
| None | 没有线 |
pyplot库的坐标轴以及其他标签的使用:
|--------------|---------------|
| 函数 | 作用 |
| plt.axis() | 获取或者设置轴属性 |
| plt.xlim() | 设置当前x轴取值范围 |
| plt.ylim() | 设置当前y轴取值范围 |
| plt.xticks() | 设置x轴刻度值与刻度标签 |
| plt.yticks() | 设置与y轴刻度值与刻度标签 |
| plt.xlabel() | 设置x轴标签 |
| plt.ylabel() | 设置y轴标签 |
| plt.legend() | 设置当前图例 |
| plt.text() | 为图形添加文字注释 |
| plt.title() | 为坐标系添加标题 |
import numpy as np
import matplotlib.pyplot as plot
x = np.arange(10)
y1 = x
y2 = 2 * x
y3 = 3 * x
plt.plot(x, y1, "ro--". x, y2, "gv", x, y3, "bs-")
plt.xlim(0, 10) ## 设置x轴的区间
plt.ylim(0, 30)
plt.xticks([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) ##设置x轴的刻度值
plt.yticks([5, 10, 15, 20, 25, 30], ['a', 'b', 'c', 'd', 'e', 'f']) ##设置刻度值及对应标签,'a'与5对应......
##添加图例:
plt.legend(["y1 = x", "y2 = 2x", "y3 = 3x"])
子图绘制函数:
子图绘制------------subplot函数:
nrows:把绘图区分割为nrows行
ncols:分割为ncols列
index:当前指定子区域的索引: (在操作前需要先声明区域)
1 2
3 4
5 6
-----------------------------------------------------------
具体实现:
import matplotlib.pyplot as plt
import numpy as np
plt.subplot(2, 2, 1) ##声明是在区域1
plt.bar(range(7), [3, 4, 7, 6, 2, 8, 9])
plt.subplot(2, 2, 2) ##声明是在区域二
plt.plot(range(7), [3, 4, 7, 6, 2, 8, 9])
plt.subplot(2, 2, 3)
plt.scatter(range(7), [3, 4, 7, 6, 2, 8, 9])
plt.subplot(2, 2, 4)
plt.barh(range(7), [3, 4, 7, 6, 2, 8, 9])
结果展示:

pyplot模块绘图函数示例:
|-------------|-------------|
| 函数 | 作用 |
| boxplot() | 绘制箱型图 |
| bar() | 绘制竖向条形图 |
| barh() | 绘制横向条形图 |
| contour() | 绘制等高线 |
| pie() | 绘制饼图 |
| plot_date() | 绘制包含日期型数据的图 |
| polar() | 绘制极坐标图 |
| scatter() | 绘制散点图 |
| specgram() | 绘制频谱图 |
| stem() | 绘制火柴杆图 |
| step() | 绘制步阶图 |
| hist() | 绘制直方图 |
| psd() | 功率谱密度 |
基本使用语法:
plt.bar(x, height, width, bottom, align, color)
前两个为必选参数,分别代表柱状图中柱子中心的位置,
· x通常是一个一维数组或可迭代对象,比如列表、元组等。用于指定每个柱子的中心位置。
· height代表柱子的高度;
· width代表柱子的宽度;
· bottom代表柱子的底部位置;
· align代表柱子的对齐方式;
· color代表柱子的颜色。
其余用法相似