Python和科学计算认证群组  - 讨论区

标题:征集Python和MATLAB的对比

2011年02月05日 星期六 11:45

书中需要添加一段关于Python和MATLAB的对比,由于我对MATLAB的了解还停留在6.0版本。因此可能无法进行比较公平的对比。我写了一小段。希望比较了解MATLAB的朋友所说您的看法。

--------------------------------------------------

由于Python语言的简洁、易读以及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python教授程序设计课程。例如麻省理工学院的计算机科学及编程导论课程就使用Python语言讲授。众多开源的科学计算软件包都提供了Python的调用接口,例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。而Python专用的科学计算扩展库就更多了,例如三个十分经典的科学计算扩展库:NumPy、SciPy和matplotlib,它们分别为Python提供了快速数组处理、数值运算以及绘图等功能。因此Python语言十分适合工程技术、科研人员处理实验数据,制作图表,甚至开发科学计算应用程序。

说起科学计算,首先会被提到的可能是MATLAB。然而除了MATLAB的一些比较特殊的工具箱目前还无法替代之外,MATLAB的大部分常用功能都可以在Python世界中找到相应的扩展库。和MATLAB相比,用Python做科学计算有如下优点:

* 首先,MATLAB是一款商用软件,并且价格不菲。而Python完全免费,众多开源的科学计算库都提供了Python的调用接口。用户可以在任何计算机上免费安装Python及其绝大多数扩展库。

* 其次,与MATLAB相比Python是一门更易学、更严谨的程序设计语言。它能让用户编写出更易读、易维护的代码。

* 最后,MATLAB主要专注于工程和科学计算。然而即使在计算领域,也经常会遇到文件管理、界面设计、网络通信等各种需求。而Python有着丰富的扩展库,可以轻易完成各种高阶任务,开发者可以用Python实现完整应用程序所需的各种功能。

2011年02月06日 星期日 09:43

刚开始使用起来matlab比较方便一些吧,毕竟是一个成熟的集成的很好的系统。而python用numpy这些库做科学计算的话不仅要自己安装配置还需要考虑各种接口问题,稍显麻烦一点。

 

还有,我一个学物理的同学,他们实验室就是用python在做实验模拟,貌似是计算电动势能之类的。

2011年02月06日 星期日 10:38

呵呵,我主要是想征求一下Python优于MATLAB的观点。至于集成环境的话,windows下Python(x,y)是一个不错的选择,linux下的话可以用sage。

我觉得目前科学计算方面,Python更缺的是文档。本书试图在这方面做一些贡献,但是需要在书中写一些比较正面的比较,让出版社和读者都对Python更有信心一些。

2011年02月06日 星期日 11:30

顶。python的确是非常好学的语言。

如果光就科学计算来说,跟matlab难易差不多,还是免费的。。

2011年02月09日 星期三 19:04

主要是第三点,Python在完成科学计算的同时可以锦上添花

Python图表更标志一点,由于还有其他的例如网络模块,界面模块,所以科学计算可以做的更有时代性

重要的是Python是一门编程语言,学习科学计算的同时,也是在掌握一门编程语言,这个编程语言不仅

仅是科学计算,相反科学计算仅仅是Python应用的一个新兴领域,我们需要认识他,应用它。因

为Python是未来的语言。同时,Python的应用是广阔的

 

2011年02月10日 星期四 20:46

最近用Python写了一个从串口和一个模拟信号输入设备读入数据的程序,对Python的便利又加深了一层体会。串口读入数据用的是pyserial,模拟信号输入设备则使用ctypes直接调用其DLL驱动。所有读入的数据都很容易转换成NumPy的数组,然后实现绘图显示、数据处理以及保存数据等功能。整个程序一个文件,500多行而已。界面用的是TraitsUI、绘图用的是Chaco。

最初考虑用C#编写,结果发现C#在将字符串转换成数组,或者将数组快速保存成文件等方面都比较费事。而且界面也不灵活,绘图库ZedGraph用起来也不如Chaco方便。

我想用MATLAB去实现这样的功能可能会更麻烦。

2011年02月10日 星期四 21:04

这是我经常处理的一个情况,平时用Matlab和origin来画图

大体意思  就是在垂直于Y方向平行于X方向上有五条扫描线,在扫描线上我每隔一段距离可以知道Z的值

这样就知道了一下(x,y,z)的散点,用Matlab或者Origin画出的图如下

图中L为X,U为Y,H为Z。可以得出这种三维效果。

刚才想用mayavi mlab 中的surf()简单尝试一下,但是画出的图还是一个平面的,估计不对

不知道如何画出上边的立体效果图

 

刚刚学习Python,有些地方难免“幼稚”,见谅,真心请教

2011年02月10日 星期四 21:29

我想可能是因为你的数据在X,Y轴方向上的取值范围相差比较大的原因。你可以看看你原始数据的X轴的范围。

调用surf()时设置extent=(-1, 1, -1, 1, -1, 1)。这样X,Y,Z三个轴
就一样长了。
这样带来的问题就是调用axes()显示数据轴时不能按照实际的数据范围显示,
可以设置其ranges=(xmin, xmax, ymin, ymax, zmin, zmax)为实际的数据范围
解决这个问题。比MATLAB等绘图稍微麻烦一点,但是你可以把它写成一个函数。

下面是一个例子:
from enthought.mayavi import mlab
import numpy as np
y, x = np.ogrid[-1:1:100j,-10:10:100j]
z = np.sin(5*((x/10)**2+y**2))
mlab.surf(x, y, z, extent=(-1,1,-1,1,-0.5,0.5))
mlab.axes(ranges=(-10,10,-1,1,-1,1), nb_labels=5)
mlab.show()

程序输出的图像如下:

2011年02月10日 星期四 22:44

这是一条扫描线上的数据绘制的图 y的取值是-50:2:50,X是2

当多条扫描线的时候,Y的取值是-50:2:50,X是0:2:10,Z是-120到160的散点值   得出的还是平面

图,只是将所有扫描线的线,收尾连接起来,就像这个图示的(Z轴数据调小之后也不行)

这种给定XYZ的值, 好像surf()无法画出立体图来,不知道怎么画出立体的形状

2011年02月10日 星期四 23:13

你的数据可以是三个一维的数组吧。如果X和Y是等间距网格的话,只需要把Z轴数据reshape成二维的即可。你可以把数据传上来,或者发邮件给我,我帮你看看。

2011年02月10日 星期四 23:53

看了数据,X,Y,Z都是三个1维的数据,需要把Z轴的数据转成2维的数组。X,Y轴只需要取其网格上的值即可,下面是程序。假设你的数据保存在xyz.csv中,并且删除了其中的标题行和星号的分割行,只有存数据:

from enthought.mayavi import mlab

 

import numpy as np

 

data = np.loadtxt("xyz.csv", delimiter=",")

x,y,z = data.T

x.shape = -1, 60

y.shape = -1, 60

z.shape = -1, 60

mlab.surf(z, extent=[-1,1,-1,1,-1,1], representation="wireframe", color=(0,0,0), line_width=1.0)

mlab.surf(z, extent=[-1,1,-1,1,-1,1], representation="surface")

mlab.axes(ranges=(x.min(), x.max(), y.min(), y.max(), z.min(), z.max()), nb_labels=5 )

mlab.show()

为了和 Matlab或者Origin的效果一样, 程序中调用两次surf()分别绘制线框和面。其效果如下:

下面看看传入surf的z的形状。由于X和Y轴上是等距离网格,因此可以省略它们。然后通过axes的ranges指定轴上的数据范围。

In [52]: z.shape

Out[52]: (6, 60)

如果你希望传入X,Y轴的数据的话,那么如下调用:

mlab.surf(x[0],y[:,0],z, extent=[-1,1,-1,1,-1,1], representation="surface")

 

In [53]: x[0]

Out[53]: 

array([-50.        , -48.30508475, -46.61016949, -44.91525424,

       -43.22033898, -41.52542373, -39.83050847, -38.13559322,

       -36.44067797, -34.74576271, -33.05084746, -31.3559322 ,

       -29.66101695, -27.96610169, -26.27118644, -24.57627119,

       -22.88135593, -21.18644068, -19.49152542, -17.79661017,

       -16.10169492, -14.40677966, -12.71186441, -11.01694915,

        -9.3220339 ,  -7.62711864,  -5.93220339,  -4.23728814,

        -2.54237288,  -0.84745763,   0.84745763,   2.54237288,

         4.23728814,   5.93220339,   7.62711864,   9.3220339 ,

        11.01694915,  12.71186441,  14.40677966,  16.10169492,

        17.79661017,  19.49152542,  21.18644068,  22.88135593,

        24.57627119,  26.27118644,  27.96610169,  29.66101695,

        31.3559322 ,  33.05084746,  34.74576271,  36.44067797,

        38.13559322,  39.83050847,  41.52542373,  43.22033898,

        44.91525424,  46.61016949,  48.30508475,  50.        ])

 

In [54]: y[:,0]

Out[54]: array([  0.,   2.,   4.,   6.,   8.,  10.])

2011年02月11日 星期五 00:21

谢谢拉。知道错哪了,刚开始的时候,就直接粘贴EXCEL的数据,在一个[]里,

X=np.array([-50, 

-48.3050, 

-46.610169, 

...............])

再用x.reshape((1,-1))也没什么用处

只能是一维数据了,画出来的肯定是线....

:-) 基础还没搞好...

 

 

 

2011年02月27日 星期日 11:41

还有一点就是python通吃,各个领域,我是做分子生物信息学的,也用python,真是很强大

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号