numpy与matplotlib学习——数据可视化入门

引言:

数据可视化即是将计算出的结果以图表等形式展现出来,使结果更加直观,并广泛被运用在数学建模的过程中:

· 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代表柱子的颜色。

其余用法相似
相关推荐
世事如云有卷舒39 分钟前
Linux驱动学习笔记(十)
linux·笔记·学习
moxiaoran57531 小时前
uni-app学习笔记十五-vue3页面生命周期(二)
笔记·学习·uni-app
快乐肚皮1 小时前
Redission学习专栏(一):快速入门及核心API实践
学习·实战·api·redission
Felix Du1 小时前
计算机网络 | 1.1 计算机网络概述思维导图
笔记·学习·计算机网络·程序人生·考研
nenchoumi31192 小时前
Mujoco 学习系列(番外一)MJX 部署与配置
人工智能·学习·机器学习·机器人
@PHARAOH2 小时前
WHAT - 学习 WebSocket 实时 Web 开发
websocket·网络协议·学习
之之为知知2 小时前
数学笔记三:特殊矩阵
笔记·学习·线性代数·算法·职场和发展·矩阵·职场发展
霸王蟹3 小时前
React 泛型组件:用TS来打造灵活的组件。
前端·学习·react.js·typescript·前端框架
代码小将3 小时前
java方法重写学习笔记
java·笔记·学习
行走的bug...3 小时前
makefile学习笔记
linux·笔记·学习