科学计算和可视化
一、numpy和matplotlib库的学习笔记
1、numpy库
numpy很简单,Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy、matplotlib一起使用。其实,list已经提供了类似于矩阵的表示形式,不过numpy为我们提供了更多的函数。
(1)数组常用函数
1)where() #按条件返回数组的索引值
2)take(a,index) #从数组a中按照索引index取值
3)linspace(a,b,N) #返回一个在(a,b)范围内均匀分布的数组,元素个数为N个
4)a.fill() #将数组的所有元素以指定的值填充
5)diff(a) #返回数组a相邻元素的差值构成的数组
6)sign(a) #返回数组a的每个元素的正负符号
7)piecewise(a,[condlist],[funclist]) #数组a根据布尔型条件condlist返回对应元素结果
8)a.argmax(),a.argmin() #返回a最大、最小元素的索引
(2)改变数组维度
1)a.ravel(),a.flatten(): #将数组a展平成一维数组
2)a.shape=(m,n),a.reshape(m,n): #将数组a转换成m*n维数组
3)a.transpose,a.T #转置数组a
(3)数组组合
1)hstack((a,b)),concatenate((a,b),axis=1) #将数组a,b沿水平方向组合
2)vstack((a,b)),concatenate((a,b),axis=0) #将数组a,b沿竖直方向组合
3)row_stack((a,b)) #将数组a,b按行方向组合
4)column_stack((a,b)) #将数组a,b按列方向组合
(4)数组分割
1)split(a,n,axis=0),vsplit(a,n) #将数组a沿垂直方向分割成n个数组
2)split(a,n,axis=1),hsplit(a,n) #将数组a沿水平方向分割成n个数组
(5)数组修剪和压缩
1)a.clip(m,n) #设置数组a的范围为(m,n),数组中大于n的元素设定为n,小于m的元素设定为m
2)a.compress() #返回根据给定条件筛选后的数组
(6)数组属性
1)a.dtype #数组a的数据类型
2)a.shape #数组a的维度
3)a.ndim #数组a的维数
4)a.size #数组a所含元素的总个数
5)a.itemsize #数组a的元素在内存中所占的字节数
6)a.nbytes #整个数组a所占的内存空间
7)a.astype(int) #转换a数组的类型为int型
(7)数组计算
1)average(a,weights=v) #对数组a以权重v进行加权平均
2)mean(a),max(a),min(a),middle(a),var(a),std(a) #数组a的均值、最大值、最小值、中位数、方差、标准差
3)a.prod() #数组a的所有元素的乘积
4)a.cumprod() #数组a的元素的累积乘积
5)cov(a,b),corrcoef(a,b) #数组a和b的协方差、相关系数
6)a.diagonal() #查看矩阵a对角线上的元素
7)a.trace() #计算矩阵a的迹,即对角线元素之和
2、matplotlib库
Python 中可以用 matplotlib 库实现数据的可视化,以下是 matpltlib 库的一些介绍:
(1) matplotlib.pyplot 模块可以画折线图,分为两个步骤,分别是 pyplot.plot() 和 pyplot.show() ,前者负责画图,后者将画好的图展示出来。
(2) pyplot.plot( Series1 , Series2 ) 以 Series1 作为横坐标, Series2 作为纵坐标画出折线图;
(3) 在执行 2 中的函数后,可以使用 pyplot.xticks( rotation = 45 ) 将 x 轴的坐标显示逆时针旋转 45 ° ,默认为 0 °,也就是水平的,同理,可以用 pyplot.yticks( rotation = 45 ) 对 y 轴坐标做同样的操作。
(4) 可以使用 pyplot.xlabel( str ) 将 x 轴命名为 str 的值,同理可以用 pyplot.ylabel( str ) 将 y 轴命名为 str 的值。
(5 )可以使用 pyplot.title( str ) 为画出的折线图命名。
(6) fig = pyplot.figure() 指出默认画图区间。
(7) fig.add_subplot( 3 , 2 , 1 ) 在画图区间中添加子图,位置为,将画图区间分为三行两列的六块中的第一块,这里数的顺序为,从左往右,从上到下,按照此逻辑, ( 3 , 2 , 1 ) 所在的位置为第一行最左边, ( 3 , 2 , 3 ) 的位置为第二行左边,( 3 , 2 , 6 ) 的位置为第三行最右边。
(8)pyplot.figure( figsize = ( 3 , 6 ) )
指定画图的区域为 长为 3 , 宽为 6 的大小。
(9) pyplot.plot( x , y , c = 'red' , label = ' 250 ' )
c 指定这一条线为红色,这里可以用颜色的英文名,也可以用颜色代号,那个 # 什么的;
label 指定这条线的名字为 250.
(10) pyplot.legend( loc = 'best' )
将所有线的名字与线的对照框放到最适合的位置, loc 还可以设置为别的参数。
11 ax = pyplot.subplots()
构建一个 pyplot 的子图对象。
(12 )ax.bar( list1 , list2 , 0.5 )
list1 为条形图各个条距离远点的长度, list2 为条形图中条的高度, 0.5 为条的宽度,通过这三个数据确定图形的形状。
(13) ax.set_xticks( list )
设置 X 轴的坐标长度和标号,对于 y 轴也有对应函数实现此功能。
(14) ax.set_xticklabels( list )
设置 x 轴的坐标名,对于 y 轴也有对应函数实现此功能。
(15)ax.set_xlabel( str )
设置 x 轴的名称,对于 y 轴也有对应函数实现此功能。
(16) ax.set_title( str )
设置图标的名称。
(17)ax.barh( list1 , list2 , 0.5 )
画水平的柱形图,其他函数一样, x 、 y 轴做对应转换。
(18) ax.scatter( list1 , list2 )
画散点图。
(19)ax.hist( array , range ,bins )
画柱形图, array 中的数值作为横轴的值,纵轴计算数值出现的次数, range 表示数值显示的范围, bins 表示总的显示柱的个数(控制间距)。
(20) ax.set_ylim( 0 , 50 )
设置纵轴的显示范围为 0 到 50 。
(21 ) ax.boxplot( Series )
画箱线图(还没搞明白箱线图是个什么玩意儿)。
(22)ax.boxplot( Series[ list ].value )
画 好几个箱线图。
(23) ax.tick_params( bottom = False , top = False , left = False , right = False )
设置图形框四边,是否显示刻度。
(24) for key,spine in ax.spines.items():
spine.set_visible(False)
隐藏图形框的四条边框线。
(25) pyplot.legend()
只对上一个画出的图有效,所以如果每个子图都要这个的话,就得在画下一个之前调用。
二、Python123成绩雷达图
1、代码:
import numpy as np import matplotlib.pyplot as plt las=['第二周','第三周','第四周','第五周','第六周'] datal=5 data=np.array([100,96.7,100,110,70]) angles=np.linspace(0,2*np.pi,datal,endpoint=False) data=np.concatenate((data,[data[0]])) angles=np.concatenate((angles,[angles[0]])) fig=plt.figure() ax=fig.add_subplot(111,polar=True) ax.plot(angles,data,'rv--',linewidth=2) plt.thetagrids(angles*180/np.pi,las,fontproperties="SimHei") ax.set_title("信计一班31号乒乓的成绩表",fontproperties="SimHei") ax.grid(True) plt.show()
2、结果展示:
三、自定义手绘风
1、代码
from PIL import Image import numpy as np a = np.asarray(Image.open(r'索隆.jpg').convert('L')).astype('float') depth = 10. # (0-100) grad = np.gradient(a) # 取图像灰度的梯度值 grad_x, grad_y = grad # 分别取横纵图像梯度值 grad_x = grad_x * depth / 100. grad_y = grad_y * depth / 100. A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.) uni_x = grad_x / A uni_y = grad_y / A uni_z = 1. / A vec_el = np.pi / 2.2 # 光源的俯视角度,弧度值 vec_az = np.pi / 4. # 光源的方位角度,弧度值 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 轴的影响 b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z) # 光源归一化 b = b.clip(0, 255) im = Image.fromarray(b.astype('uint8')) # 重构图像 im.save(r'手绘索隆.jpg')
2、原图(上)和效果图(下)
正切函数
1、代码
import numpy as np import pylab as pl import matplotlib.font_manager as fm import matplotlib t=np.arange(0.0,5.0*np.pi,0.02) s=np.tan(t) pl.plot(t,s,label='正切') pl.xlabel('x',fontproperties='SimHei',fontsize=18) pl.ylabel('y',fontproperties='SimHei',fontsize=18) pl.title('tan函数图像',fontproperties='SimHei',fontsize=24) pl.show()
2、图像(话说这图有点奇怪@-@)