科学计算和可视化

今天的主题是有关科学计算和可视化的,其中将会包括有python的第三方库numpy以及matplotlib的学习总结及应用!

有所涉猎的同学一定对这两个库并不陌生!它们分别是对数组的处理和数据处理的图表制作工具,在数据处理方面它们都有不俗的表现!

接下来先让我简单介绍一下这两个库~(安装过程就不详述啦~pip install +库就能随心安装,或者你也可以选择直接安装Anaconda 强大的库函数多到你用不完,里面自然有今天所要展开了解的两个库啦~)

numpy:

概述:numpy(Numerical Python)提供了python对多维数组对象的支持:ndarray,具有矢量运算能力,快速、节省空间。numpy支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,它在数据处理方面有它不俗的表现力。

创建ndarray数组:ndarray:N维数组对象(矩阵),所有元素必须是相同类型。 
ndarray属性:ndim属性,表示维度个数;shape属性,表示各维度大小;dtype属性,表示数据类型。

一些函数汇总:

函数 说明
array 将输入数据(列表、元组、数组或其他序列类型)转换为ndarray、要么推断出dtype,要么显示指定dtpye。默认直接复制输入数据
asarray 将输入转换为ndarray,如果输入本身就是一个ndarray将不进行复制
arange 类似于内置的range,但返回的是一个ndarray而不是列表
ones、ones_like 根据指定的形状和dtpye创建一个全1的数组。ones_like以另一个数组为参数,并根据其形状和dtype创建一个全1的数组
zeros、zeros_like 类似上一项,创建全为0的数组
empty、empty_like 创建新数组,只分配内存空间但不填充任何值
eye、identity 创建一个正方的N*N单位矩阵(对角线为1,其余为0)

当然还有一些通用函数,比如说我们的math库中的一些计算函数fabs,abs,sqrt,sin,cos等等,这些同样适合于ndarray,这里就不一一列举了。

现在来看看我们的实例应用吧~

实验一:

import numpy
print (‘使用列表生成一维数组‘)
data = [1,2,3,4,5]
x = numpy.array(data)
print (x)
print (x.dtype)
print (x.ndim)
print (x.shape)

print (‘使用列表生成二维数组‘)
data = [[1,0],[2,0],[3,0]]
x = numpy.array(data)
print (x)
print (x.ndim)
print (x.shape)

print (‘使用zero/ones/empty创建数组:根据shape来创建‘)
x = numpy.zeros(5)
print (x)
x = numpy.zeros((3,3))
print (x)
x = numpy.ones((2,3))
print (x)
x = numpy.empty((3,2))
print (x)

print (‘使用arrange生成连续元素‘)
print (numpy.arange(5))
print (numpy.arange(0,5,2))

效果:

我们看到这个试验中我们新建了一些特殊数组(单位数组即全1数组,全0数组,以及一、二维数组,当然还有其中各元素的type(类型)的讨论)

我们还可以学习到numpy中的ndarray的数据类型,有大致下面几种:

类型 类型代码 说明
int8、uint8 i1、u1 有符号或无符号的8位(1个字节)整型
int16、uint16 i2、u2 有符号或无符号的16位(2个字节)整型
int32、uint32 i4、u4 有符号或无符号的32位(4个字节)整型
int64、uint64 i8、u8 有符号或无符号的64位(8个字节)整型
float16 f2 半精度浮点数
float32 f4/f 标准的单精度浮点数。与C的float兼容
float64 f8/d 标准的双精度浮点数。与C的double和python的float对象兼容
float128 f16/g 扩展精度浮点数
complex64、complex128 c8/c16 分别用两个32位、64位或128位的浮点数表示复数
complex256 c32 复数
bool ? 储存True和False值的布尔类型
object O python对象类型
string_ S 固定长度的字符串类型(每个字符1个字符)S10即为创建长度为10的字符串
unicode_ U 固定长度的unicode类型(字节数由平台决定)U10即为创建长度为10的unicode

实验二:

import numpy

print (‘生成指定元素类型的数组:设置dtype属性‘)
x = numpy.array([1,2.6,3],dtype = numpy.int64)
print (x)
print (x.dtype)
print (x.ndim)
print (x.shape)
x = numpy.array([1,2,3],dtype = numpy.float64)
print (x)
print (x.dtype)
print (x.ndim)
print (x.shape)
x = numpy.array([-1,-2,-3,-4],dtype = numpy.uint16)
print (x)
print (x.dtype)
print (x.ndim)
print (x.shape)

print (‘使用astype复制数组,并转换类型‘)
x = numpy.array([1,2.6,3],dtype = numpy.float64)
y = x.astype(numpy.int32)
print (y)
print (x)
print (x.ndim)
print (x.shape)
z = y.astype(numpy.float64)
print (z)
print (x.ndim)
print (x.shape)

print (‘将字符串元素转换为数值元素‘)
x = numpy.array([‘1‘,‘2‘,‘3‘],dtype = numpy.string_)
y = x.astype(numpy.int32)
print (x)
print (x.ndim)
print (x.shape)
print (y)

print (‘使用其他数组的数据类型作为参数‘)
x = numpy.array([ 1., 2.6,3. ],dtype = numpy.float32)
y = numpy.arange(3,dtype=numpy.int32)
print (y)
print (y.astype(x.dtype))

效果:

在这个实验中,我们具体讨论了数组的不同数据类型的情况下生成数据的例子,我们尝试了int,float,和uint三种形式,得到了想要的结果(其中我们知道uint是无符号整型,它在计算机内存中一其相对应正数的补码形式存在,故会出现上述情况,-1的补码是1111 1111,值为10进制数为65535)我们还对dtype属性进行讨论,尝试了复制其属性的功能……

实验三:

import numpy
print (‘ndarray数组与标量/数组的运算‘)
x = numpy.array([1,2,3])
print (x*2)
print (x**2)
print (x>2)
y = numpy.array([3,4,5])
print (x+y)
print (x^y)
print (x>y)

print (‘ndarray的花式索引:使用整型数组作为索引‘)
x = numpy.array([1,2,3,4,5,6])
print (x[[0,1,2]])
print (x[[-1,-2,-3]])
x = numpy.array([[1,2],[3,4],[5,6]])
print (x[[0,1]])
print (x[[0,1],[0,1]]) # [1,4] 打印x[0][0]和x[1][1]
print (x[[0,1]][:,[0,1]]) # 打印01行的01列 [[1,2],[3,4]]
# 使用numpy.ix_()函数增强可读性
print (x[numpy.ix_([0,1],[0,1])])
x[[0,1],[0,1]] = [0,0]
print (x)# [[0,2],[3,0],[5,6]]

效果:

该例有数组之间的简单的数乘运算以及bool运算和花式索引的实现~

实验四:

import numpy
print (‘ndarray数组的转置和轴对换‘)
k = numpy.arange(9)
m = k.reshape((3,3)) # 改变数组的shape复制生成2维的,每个维度长度为3的数组
print (k)
print (m)
# 转置(矩阵)数组:T属性 : mT[x][y] = m[y][x]
print (m.T)
# 计算矩阵的内积 xTx
print (numpy.dot(m,m.T)) # numpy.dot点乘
# 高维数组的轴对象
k = numpy.arange(8).reshape(2,2,2)
print (k)
print (k[1][0][0])
# 轴变换 transpose 参数:由轴编号组成的元组
m = k.transpose((1,0,2))
print (m)
print (m[0][1][0])
# 轴交换 swapaxes (axes:轴),参数:一对轴编号
m = k.swapaxes(0,1)
print (m)
print (m[0][1][0])
# 使用轴交换进行数组矩阵转置
m = numpy.arange(9).reshape((3,3))
print (m)
print (m.swapaxes(1,0))

效果:

该例,就是有关数列或说矩阵的基本运算(数乘运算,转置,点乘等)……

学习了这些numpy库已经在日常中基本够用,当然它还有很多值得探讨深挖的部分,上述只是冰山一角哦~当然不要忘了多加练习!!

matplotlib:

概述:matplotlib是基于numpy的一套Python工具包。这个包提供了丰富的数据绘图工具,主要用于绘制一些统计图形。

在这个强大的库的学习过程中,我得到了一个非常有用的消息:IPython的使用,特别在matplotlib的运用中,这个环境下的表现出乎意料的好!不禁感叹聪明的计算机工程师大触们的才智之高!

那么如何使用IPython库呢?

一样用cmd命令行,利用指令"ipython --pylab"就可以调用出IPython环境:

然后输入代码(从网上copy并稍作修改):

效果:

非常nice的效果,直观又美观!matplotlib实在是作图做表神器!

matplotlib参数设置:

在代码执行过程中,有两种方式更改参数:

  • 使用参数字典(rcParams)
  • 调用matplotlib.rc()命令 通过传入关键字元组,修改参数

axex: 设置坐标轴边界和表面的颜色、坐标刻度值大小和网格的显示
backend: 设置目标暑促TkAgg和GTKAgg
figure: 控制dpi、边界颜色、图形大小、和子区( subplot)设置
font: 字体集(font family)、字体大小和样式设置
grid: 设置网格颜色和线性
legend: 设置图例和其中的文本的显示
line: 设置线条(颜色、线型、宽度等)和标记
patch: 是填充2D空间的图形对象,如多边形和圆。控制线宽、颜色和抗锯齿设置等。
savefig: 可以对保存的图形进行单独设置。例如,设置渲染的文件的背景为白色。
verbose: 设置matplotlib在执行期间信息输出,如silent、helpful、debug和debug-annoying。
xticks和yticks: 为x,y轴的主刻度和次刻度设置颜色、大小、方向,以及标签大小。

作为中国程序员,在面向中国人群体时,我们在制作图表的过程中免不了会使用中文标注,分析等,那要怎么加中文字呢?
我们会使用:

import matplotlib.pyplot as plt
plt.rcParams[‘font.family‘]=[‘SimHei‘] #用来正常显示中文标签
plt.rcParams[‘axes.unicode_minus‘]=False #用来正常显示负号

还是刚刚的代码,加了中文的“SimHei”(黑体)显示,可以有下面的表现形式:

import matplotlib.pyplot as plt
plt.rcParams[‘font.family‘]=[‘SimHei‘]
plt.rcParams[‘axes.unicode_minus‘]=False
labels=‘青蛙‘,‘猪‘,‘狗子‘,‘原木‘
sizes=25,20,45,60
colors=‘yellowgreen‘,‘gold‘,‘lightskyblue‘,‘lightcoral‘
explode=0,0.2,0,0
plt.pie(sizes,explode=explode,labels=labels,colors=colors,autopct=‘%1.2f%%‘,shadow=True,startangle=50)
plt.axis(‘equal‘)
plt.show()

ok~

当制作折线图的时候,我们还会运用其他一些功能:

线条标记及相关属性:

线条风格linestyle或ls 描述
‘-‘ 实线
‘—‘ 破折线
‘-.‘ 点划线
‘:‘ 虚线
‘None‘,‘‘,‘‘ 什么都不画
标记masker 描述 标记 描述
‘o‘ 圆圈 ‘.’
‘D‘ 菱形 ‘s‘ 正方形
‘h‘ 六边形1 ‘*‘ 星号
‘H‘ 六边形2 ‘d‘ 小菱形
‘_‘ 水平线 ‘v‘ 一角朝下的三角形
‘8‘ 八边形 ‘<‘ 一角朝左的三角形
‘p‘ 五边形 ‘>‘ 一角朝右的三角形
‘,‘ 像素 ‘^‘ 一角朝上的三角形
‘+‘ 加号 ‘\
‘None‘,‘‘,‘‘ ‘x‘ X

当然还有颜色,背景颜色等参数的设置,具体跟其他常规库别无二致。

例如:

通过向如matplotlib.pyplot.axes()或者matplotlib.pyplot.subplot()这样的方法提供一个axisbg参数,可以指定坐标这的背景色。

subplot(111,axisbg=(0.1843,0.3098,0.3098)

通过更深入的学习,折线图,条形图,饼图,流程图,梯形图等等你都能制作,结合numpy的数据分析,你能够运用强大的计算分析众多数据,让你更直观地认识,理解眼前的世界!

(形式丰富的分析图形表格)

下面是我的实例!!

成绩雷达图:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib
plt.rcParams[‘font.family‘]=‘SimHei‘

labels=np.array([‘总成绩‘,‘单选‘,‘程序题‘,‘剩余用时‘,‘复写率‘])
nAttr=5
data=np.array([7.4,8,6.8,2,9])
angles=np.linspace(0,2*np.pi,nAttr,endpoint=False)
data=np.concatenate((data,[data[0]]))
angles=np.concatenate((angles,[angles[0]]))
fig=plt.figure(facecolor=‘white‘)
plt.subplot(111,polar=True)
plt.plot(angles,data,‘b*-‘,color=‘y‘,linewidth=3)
plt.fill(angles,data,facecolor=‘g‘,alpha=0.25)
plt.thetagrids(angles*180/np.pi,labels)
plt.figtext(0.52,0.95,‘iconangle的成绩表‘,ha=‘center‘)
plt.grid(True)
plt.savefig(‘scorce_radar.JPG‘)
plt.show()

效果:

看上去我的单选似乎更强一点(耸肩)

进阶地,研究一个物理规律:我选择研究单摆

伽利略曾对单摆的运动产生浓厚的兴趣,我通过查找单摆的运动公式,得到一个这样的单摆周期计算公式:

T=2π√(L/g)

那么利用numpy以及matplotlib可以绘制出这个规律的模型:

代码如下:

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams[‘font.family‘]=‘SimHei‘
plt.title("在重力加速度为9.8m/s的时候单摆的周期(T)与摆长(L)关系")
plt.xlabel(‘摆长(L)‘)
plt.ylabel(‘周期(T)‘)
x=np.linspace(0.0,40.0,1000)
y=2*np.pi*np.sqrt(x/9.8)
plt.plot(x,y,‘k‘,color=‘g‘,linewidth=3,linestyle=‘-‘)
plt.show()

效果:

直观又美观!相当棒!

那么今天的学习分享就先到这里啦~谢谢关注!!

原文地址:https://www.cnblogs.com/iconangle/p/10741465.html

时间: 2024-09-29 21:50:37

科学计算和可视化的相关文章

科学计算三维可视化---TVTK库可视化实例

一:TVTK库可视化实例 Plot3D文件知识:PLOT3D 数据格式 PLOT3D文件分为网格文件(XYZ 文件), 空气动力学结果文件 (Q 文件)和通用结果文件(函数文件 + 函数名称文件).网格文件中可加入所谓的IBlank参数. (一)标量数据可视化(等值面) generate_values()创建等值面 from tvtk.api import tvtk from Tvtkfunc import ivtk_scene,event_loop def read_data(): #导入数据

科学计算三维可视化---TVTK入门(数据加载)

一:数据加载 大多数可视化应用的数据并非是在TVTK库中构建的,很多都是通过接口读取外部数据文件 (一)使用vtkSTLReader来读取外部文件 .stl 文件是在计算机图形应用系统中,用于表示三角形网格的一种文件格式.格式简单,应用广泛 def ivtk_scene(actors): from tvtk.tools import ivtk # 创建一个带有Crust(Python Shell)的窗口 win = ivtk.IVTKWithCrustAndBrowser() win.open(

科学计算三维可视化---Mayavi入门(Mayavi库的基本元素和绘图实例)

一:Mayavi库的基本元素 1.处理图形可视化和图形操作的mlab模块 2.操作管线对象,窗口对象的api (一)mlab模块 (二)mayavi的api 二:快速绘图实例 (一)mlab.mesh的使用,快速创建绘图 >>> x = [[-1,1,1,-1,-1],[-1,1,1,-1,-1]] >>> y = [[-1,-1,-1,-1,-1],[1,1,1,1,1]] >>> z = [[1,1,-1,-1,1],[1,1,-1,-1,1]]

科学计算三维可视化---Mayavi可视化实例

一:Dragon绘制实例(三维扫描的绘制) 三维扫描主要用于对物体空间外形结构以及色彩进行扫描,用以获得物体表面的空间坐标, 他的主要意义在于能够将实物的立体信息转换为计算机能够直接处理的数据信号,为实物的数字化提供了相对方便快捷的手段, 因此,三维扫描为工业建模,文物保存,虚拟空间构建都起到了非常重要的作用. 下载地址:http://graphics.stanford.edu/data/3Dscanrep/,页面搜索Dragon即可 提取文件 import tarfile,os #读取tar压

科学计算三维可视化---Traits(Property属性)

Property属性 使用Property函数为类创建Property属性,Property属性用法和一般属性相同,但是他在获取值和赋值时会调用相应的方法 traits库也提供了Property属性 from traits.api import Property from traits.api import Property,HasTraits,Float,cached_property class rectangle(HasTraits): w = Float(1.0) h = Float(2

python科学计算与可视化视频教程

目录: 下载链接:https://www.yinxiangit.com/616.html 第一单元TVTK入门-1.mp4第一单元TVTK入门-2.mp4第一单元TVTK入门-3.mp4 第一单元TVTK入门-4.mp4第七单元Mayavi可视化实例-1.mp4第七单元Mayavi可视化实例-2.mp4第七单元Mayavi可视化实例-3.mp4第三单元TVTK库可视化实例-1.mp4第三单元TVTK库可视化实例-2.mp4第三单元TVTK库可视化实例-3.mp4第九单元Traits基础-1.mp

科学计算三维可视化---TraitsUI(View定义界面)

View定义界面 使用View来自定义界面 class ModelManager(HasTraits): model_name = Str category = Str model_file = Str model_number = Int view = View( Item("model_name", label=u"模型名称"), #将Traits属性和Item关联起来,分别定义标签,中文需要使用u Item("model_file", la

科学计算三维可视化---TraitsUI(控件)

一:文本编辑器 from traits.api import HasTraits,Int,Str,Password from traitsui.api import View,Item,Group,ModalButtons #View描述了界面的视图类,Item模块描述了界面中的控件类 class TextEdit(HasTraits): #定义文本编辑器的变量 string_trait = Str("sample string") password = Password #定义布局

科学计算三维可视化---TraitsUI与Mayavi实例

TraitsUI与Mayavi实例 一:创建一个简单的TraitsUI与Mayavi实例 from numpy import sqrt,sin,mgrid from traits.api import HasTraits,Instance from traitsui.api import View,Item from tvtk.pyface.scene_editor import SceneEditor from mayavi.tools.mlab_scene_model import Mlab