科学计算和可视化

一、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、图像(话说这图有点奇怪@-@)

 

posted @ 2019-04-24 22:24    阅读(171)  评论(0编辑  收藏  举报