Belinda,

I will give a short answer, and maybe someone else will be able to 
provide a more complete answer or a reference to one.

belinda thom wrote:
> Hi,
> 
> I'm using matplotlib w/numerix set to numpy (as described in my prior  
> post).
> 
> What I am wondering is in what situations one would want to:
> 
> import pylab
> import numpy

One reason for doing this would be make it clear where your numeric 
components are really coming from, and to take full advantage of numpy.
An idiom that I often use is
import pylab as P
import numpy as N
and then anything that ultimately comes from numpy anyway, like arange, 
I invoke as N.arange rather than P.arange.  Or you can do it all at the 
top of the script with "from pylab import ..." and "from numpy import ...".

> 
> together, because there is matlab-style stuff (e.g. matrices, arrays,  
> cumprod, fft, arange etc.) by importing the pylab package alone.
> 

Pylab is a convenience package that aggregates plotting and numerical 
functionality in a single namespace while hiding the differences among 
numeric packages.  This support of alternative numeric packages has been 
an important part of matplotlib, but its utility will diminish and it 
will be phased out now that numpy is ready to use.  An advantage of 
using numpy directly now, rather than via the parts of it that pylab 
imports, is that you will be getting accustomed to the new numpy style 
rather than the compatibility mode.

> On a related note, in trying to get a better idea of how math vs.  
> plot functionality is handled in matplotlib, I looked at mlab.py and  
> pylab.py; it doesn't seem there is a clear separation of these  
> functions, but perhaps I'm missing something?
> 
You are correct.  Pylab imports everything from matplotlib.numerix.mlab. 
  Confusingly, there is a matplotlib.mlab and a matplotlib.numerix.mlab 
which uses an mlab from the selected numerical package.  The numpy 
version of mlab, in turn, imports lots of stuff from numpy--it is 
another aggregator.  It seems that numpy's mlab is trying to give a 
Matlab-like environment without the plotting, and pylab is trying to do 
the same thing but with the plotting included.

The net results of the attempts of numpy and pylab to make things 
convenient by aggregating functionality in a single namespace are (1) it 
really can be convenient--a one-stop shop, and (2) it can be very 
confusing with all the possible places things can get imported from, 
some of them with similar names.

Ipython is enormously helpful in showing where things really come from. 
For example in an "ipython -pylab" session, where "from pylab import *" 
has been done automatically by ipython, we get:

In [1]:arange?
Type:           function
Base Class:     <type 'function'>
String Form:    <function arange at 0xb54f8ca4>
Namespace:      Interactive
File: 
/usr/local/lib/python2.4/site-packages/numpy/oldnumeric/functions.py
Definition:     arange(start, stop=None, step=1, typecode=None, dtype=None)
Docstring:
     <no docstring>

Note that pylab is pulling in numpy's backwards-compatibility version of 
arange rather than its native version.

Here is another example of different versions of a function with the 
same name, first the pylab version, then the numpy version:
In [3]:linspace?
Type:           function
Base Class:     <type 'function'>
String Form:    <function linspace at 0xb53f59cc>
Namespace:      Interactive
File:           /usr/local/lib/python2.4/site-packages/matplotlib/mlab.py
Definition:     linspace(xmin, xmax, N)
Docstring:
     <no docstring>


In [4]:import numpy

In [5]:numpy.linspace?
Type:           function
Base Class:     <type 'function'>
String Form:    <function linspace at 0xb5570df4>
Namespace:      Interactive
File: 
/usr/local/lib/python2.4/site-packages/numpy/lib/function_base.py
Definition:     numpy.linspace(start, stop, num=50, endpoint=True, 
retstep=False)
Docstring:
     Return evenly spaced numbers.

     Return num evenly spaced samples from start to stop.  If
     endpoint is True, the last sample is stop. If retstep is
     True then return the step value used.


Depending on what you are doing and on the style you prefer, you may 
want to use as much as possible from pylab, or you may want to use only 
a few things from the pylab namespace and then explicitly use the 
matplotlib and numpy namespaces (and object methods) for everything 
else.  A bit of this is discussed in the matplotlib 
examples/pythonic_matplotlib.py.

I am inclined to directly invoke numpy instead of going through pylab 
and numerix.

That was longer than I intended for this message... but the complexity 
of A importing things from B and B from A via B.C, etc. is making my 
head spin.  I hope that in the process of switching matplotlib to 
numpy-only we will be able to simplify all this.

Eric

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to