11 August 2007 20:30
Python instead of Matlab for plotting?
by pvergainA few years ago I «fell in love» with Python , which is a dynamically typed interactive, object oriented scripting language. With a few extensions I found it very suitable for efficient visualization and problem solving in Scientific computing. So can it replace Matlab? For me its pretty close! For you? It depends on your needs, but have a look!
Why I use Python
* Python is a small, high level scripting language that sits on top of a efficient C library. Because of this, Python code is compact, and the resulting code can run at a speed close to C if the computationally intensive parts are done via library calls.
* Short learning curve - I was almost instantly productive.
* Python can be used interactively (like matlab), and documentation for most functions can be accessed via a built in help facility.
* It is free (also in this regard)
* The syntax invites you to write clean code. No ;'s at the end of lines, the block structure is described by indentation instead of Begin-End or {..}. Through the Numeric/numarray modules one gets powerful array syntax - inspired by languages such as Fortran 90, Matlab, Octave, Yorick etc. Python itself has also borrowed features from e.g. Lisp, with its interactivity and built in support for list manipulation.
* Python has many other useful modules built in, one may for instance write a web server in just a few lines of code or work transparently with gzipped files (handy for analyzing large ascii data files)
* Linking in and reusing Fortran subroutines is very easy using e.g. f2py mentioned below, or the Pyfort module found on www.python.org. Integration with C is of course even tighter since the most popular python is written in C. (yes. there is a java python...)
* It is possible to work in single precision, which is sufficient for most scientific purposes. This makes it easier to work with large datasets/arrays using only half the memory compared to e.g. matlab.
As my basic setup I use Python with the following extensions:
Numpy: a.k.a. Numeric python, contain the advanced array syntax, as well as powerful and commonly used functions that can be applied to the multi dimensional arrays.
Pygist: Gist is a very fast graphics library for 2D and 3D plots written directly for X11, but also ported to Mac and Windows. Gist is a part of the Yorick language. Pygist contain the Python bindings, read about it here. A recent version of Pygist can be found here. Pygist is currently also a part of a distribution of Python packages called Scipy, that can be found here.
f2py: Makes connecting Fortran subroutines a breeze! Also a part of Scipy. A complete example: wrap this subroutine in a Python function returning "dist":
[avle@tindved test]$ cat r1.f90
subroutine r1(x,y,n,dist)
real x(n),y(n)
!f2py intent(out) dist
xl=0.0 ; yl=0.0 ; vp=0.0
do i=1,n
xl=xl + x(i)**2 ; yl=yl + y(i)**2
vp=vp + x(i)*y(i)
end do
if(vp>=0.0)then
dist = acos(sqrt(vp/(xl*yl)))
else
dist = 4*atan(1.0)-acos(sqrt(-vp/(xl*yl)))
end if
end subroutine r1
[avle@tindved test]$ ls
r1.f90
[avle@tindved test]$ f2py -c -m r1 --fcompiler=g95 r1.f90
..lots of output...
[avle@tindved test]$ ls
r1.f90 r1.so*
[avle@tindved test]$ python2
Python 2.2.3 (#1, Feb 15 2005, 02:41:06)
[GCC 3.2.3 20030502 (Red Hat Linux 3.2.3-49)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import Numeric as nx, r1
>>> a=nx.array((2.3,2.2)) ; b=nx.array((3.2,2.1))
>>> r1.r1(a,b)
1.2827057838439941
>>>
1
(1 marks)