(一)Numpy+Matplotlib学习笔记
1、Numpy基础
数组
1.Numpy中的数组是ndarray 类实例化的对象。
其中包括:
实际的数据:数组的内容
元数据:对数组的描述(保存数组的长度,数组的…)
大部分对数组的操作仅仅是对元数据的操作,以此提高执行性能
Numpy中的数组必须是同质的,也就是所有的数据类型必须相同
通过基0的下标访问数组中的元素
dtype和shape的属性分别表示元素的类型和维度
实例化:
c=np.arange(起始值,终止值,步长):只能用于整数序列
c.arange(起始值,终止值,步长).reshape(2 ,3, 4)
c.ravel()
c.flastten() :赋值一份:
np.array(任何可以被解释为数组的序列
类型类型)
np.astype(目标类型) - > 转换为映射的内存的数据类型
2.数组的维度
数组的维度表示为一个元组,其中的元素按照从高纬度到低纬度的顺序排列
一维数组:一位数组中有6个元素:(6,)
二维数组:两行3列:(2,3)
三维数组:两页三行四列:(2,3,4)
a.ndim : 返回数组的维度长度数值,一维二维还是三维
a.shape : 返回元组表示数组各个维度的长度[[1,2,3],[4,5,6]]-->(2,3)
3.数据类型
内置类型
bool_:True/False
整形:int8/int16/int32/int64,uint8/uint16/uint32/uint64
浮点型:float16/float32/float64
复数:complex64/complex128
字符串:str_
复合类型
由多个相同或不同的字段组合而成的类型
np.array(...,dtype=字符类型)
'''
类型字符码
boll_:?
有符号整型:i1/2/4/8
无符号整型:u1/2/4/8
浮点:f2/4/8
复数:c8/16
c = np.array( [ ('abc',[3,4,5]),('qwe',[1,2,3]) ] , dtype={'names':['fa','fb'],'formats':['U3','3i4']}) # dtype类型描述一个字典,names表示取值时的名称。formats表示数据类型 print(b[0]['fa']) print(b[0]['fb']) #-------------------------------------------------- d = np.array( [ ('abc',[3,4,5]),('qwe',[1,2,3]) ] , dtype={'fa':('U3',0),'fb':('3i4',16)}) # 字典 {名称:(数据类型,指针地址起始位置)} print(d.itemsize)
切片
数组[start:end:步长,start:end:步长,start:end:步长...]
用法和正常Python切片相同
默认起始:首元素(正步长)/尾(负的步长)
默认终止:尾后/首前
# 普通用法
a = np.arange(1,10)
print(a[:3]) #[1,2,3]
b = np.arange(1,25).reshape(2,3,4)
print(b[:,0,0])
print(b[0,:,:])
print(b[0,...]) # ...表示连续出现的冒号
水平拆分
np.hsplit(被拆数组,拆分份数)
np.split(被拆数组,拆分份数,axis=0)
垂直拆分
np.dsplit(被拆分数组,拆分份数)
ndarray的属性
dtype - 元素的数据属性
shape - 数组的维度
ndim - 数组的维数(len(shape))
size - 数组的元素数,shape中元素相乘
itemsize - 元素的字节数
变维
数组.reshape(新维度),返回数组
就地变维:修改元数据的维度信息,不产生新的数组
数组.shaoe = 新维度
数组.resize(新维度)
2、Matplotlib基础
基本绘图
plot(x,y)
线形、线宽、颜色
plot(..., linestyle = 线形,linewidth=线宽,color=颜色,...)
设置坐标范围
xlim:(水平坐标的最小值,水平坐标的最大值)
ylim:(垂直坐标的最小值,垂直坐标的最大值)
设置坐标刻度
xticks(水平轴的刻度位置[,水平轴刻度文本])
yticks(垂直轴的刻度位置[,垂直轴刻度文本])
设置坐标轴的属性
ax = gca() - 获取当前的坐标轴图
ax.splines[‘left’] - 左纵轴
ax.splines[‘right’] - 右纵轴
ax.splines[‘top’] - 上横轴
ax.splines[‘bottom’] - 下横轴
xx = 任意轴
xx.set_position((坐标系,位置值)) #设置位置
xx.set_color(颜色) # 设置颜色
图形窗口对象
digure(窗口名,figszize=大小,dpi分辨率,dececolor=颜色)
title(窗口标题,fontsize=字体大小)
xlabel(窗口标题,fontsize=字体大小)
ylabel(窗口标题,fontsize=字体大小)
mp.xticks(()) # 去掉刻度值
mp.yticks(()) # 去掉刻度值
mp.text(0.5,0.5,'1',ha ='center',va='center', size=36,alpha=0.5)
mp.subplot(gs[0,:2])
mp.xticks(()) # 去掉刻度值
mp.yticks(()) # 去掉刻度值
mp.show()
生成条形图
bar(水平坐标,绝对高度,相对高度,color=颜色,label=图例标签,alpha=透明度)
饼图
pie(值的数组,间隙数组,标签数组,颜色数组,格式,shadow=是否带阴影,startangle=起始角度)
# 生成矩阵
x,y = np.meshgrid(np.linspace(-3,3,n),np.linspace(-3,3,n)) # 1000宽高的矩阵
# 利用函数生成个图
z1 = np.exp(-x**2 - y**2)
z2 = np.exp(-(x - 1)**2 - (y - 1)**2)
z = (z1 - z2) * 2
#创建图形窗口
mp.figure('Contour',facecolor='lightgray')
mp.gca(projection='polar') # 创建极坐标系
# 设置窗口的标题
mp.title('Contour',fontsize=20)
mp.xlabel(r'$ heta$',fontsize=14)
mp.ylabel(r'$
ho$',fontsize=14)
mp.grid(linestylr=":")
创健三维坐标系
from mpl_toolkits.mplot3d import axes3d
ax = mp.gca(projection='3d') # 变/创建三维坐标系
三维散点
ax.scatter(x,y,z,s=大小.marker=色彩,edgecolor=边缘色,facecolor=填充色,zorder=z顺序)
空间曲面
ax.plot_surface(x坐标矩阵,y坐标矩阵,z坐标矩阵,rstride=行跨距,cstride=列跨距,cmap=颜色映射)
ax.plot_wireframe(x坐标矩阵,y坐标矩阵,z坐标矩阵,rstride=行跨距,linewidth=线宽.color=颜色)
动画
通过连续显示的静态画面生成动画效果
import matplotlib.animation as ma
ma.FubcAnimation(图形窗口,更新函数,interval=间隔)
def fun(...)
(2)python作业成绩的雷达图
每次作业成绩总分:作业2(100),作业3(100),作业3(100),作业4(100), 作业5(100),作业6(70)
本人成绩:作业2(100),作业3(87.5),作业3(100),作业4(100), 作业5(100),作业6(70)
实现画图的代码为如下:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
matplotlib.rcParams['font.family']='SimHei'
matplotlib.rcParams['font.sans-serif']=['SimHei']
radar_labels = np.array(['作业2','作业3','作业4','作业5','作业6'])
#数据个数
dataLenth = 5
#数据
data = np.array([100,87.5,100,110,70])
angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False)
data=np.concatenate((data,[data[0]]))
angles = np.concatenate((angles, [angles[0]]))
fig = plt.figure(facecolor='white')
ax = plt.subplot(111, polar=True)
plt.plot(angles, data, 'bo-',color='b', linewidth=2,alpha=0.4)
plt.plot(angles, data, 'o-',linewidth=1.5,alpha=0.4)
plt.fill(angles,data,facecolor='b',alpha=0.25)
plt.thetagrids(angles * 180/np.pi,radar_labels)
plt.figtext(0.52,0.95,"02豆芽成绩表", ha='center')
plt.grid(True)
plt.show()
执行结果看下图:
(3)pythton自定义手绘风
选取进行手绘的原图
代码如下:
from PIL import Image
import numpy as np
vec_el = np.pi/2.2 # 光源的俯视角度,弧度值
vec_az = np.pi/4. # 光源的方位角度,弧度值
depth = 10. # (0-100)
a =Image.open("shang.png").convert('L')
a=np.asarray(a).astype('float')
grad = np.gradient(a) #取图像灰度的梯度值
grad_x, grad_y =grad #分别取横纵图像梯度值
grad_x = grad_x*depth/100.
grad_y = grad_y*depth/100.
dx = np.cos(vec_el)*np.cos(vec_az) #光源对x 轴的影响
dy = np.cos(vec_el)*np.sin(vec_az) #光源对y 轴的影响
dz = np.sin(vec_el) #光源对z 轴的影响
A = np.sqrt(grad_x**2 + grad_y**2 + 1.)
uni_x = grad_x/A
uni_y = grad_y/A
uni_z = 1./A
b = 255*(dx*uni_x + dy*uni_y + dz*uni_z) #光源归一化
b = b.clip(0,255)
im = Image.fromarray(b.astype('uint8')) #重构图像
im.show("shang.jpg")
执行效果如下:
(4)python画数学或物理规律
我想用pythton画三角函数
代码look:
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-10, 10, 1000) a = np.sin(x) b = np.cos(x) c = np.tan(x) # d = np.log(x) plt.figure(figsize=(8,4)) plt.plot(x,a,label='$sin(x)$',color='green',linewidth=0.5) plt.plot(x,b,label='$cos(x)$',color='red',linewidth=0.5) plt.plot(x,c,label='$tan(x)$',color='blue',linewidth=0.5) # plt.plot(x,d,label='$log(x)$',color='grey',linewidth=0.5) plt.xlabel('Time(s)') plt.ylabel('Volt') plt.title('PyPlot') plt.xlim(0,10) plt.ylim(-5,5) plt.legend() plt.show()
执行效果看下图: