From chris.chase@jhuapl.edu  Mon Mar  4 06:01:34 1996
From: chris.chase@jhuapl.edu (Chris Chase S1A)
Date: Mon, 4 Mar 1996 11:01:34 +0500
Subject: [PYTHON MATRIX-SIG] RubberIndex
In-Reply-To: <199602262127.QAA24193@cyclone.ERE.UMontreal.CA>
References: <199602261735.MAA06305@python.org>
 <199602262127.QAA24193@cyclone.ERE.UMontreal.CA>
Message-ID: <9603041601.AA21958@hurlbut.>

>>>>> "Konrad" == Konrad HINSEN <hinsenk@ere.umontreal.ca> writes:

Chase>    both selection and assignment.  This specific solution for
Chase>    flattened indexing is supported in all the array languages
Chase>    that I have had exposure to (e.g. Matlab, IDL, Tela,
Chase>    Yorick). To me this is more important than the hierarchical
Chase>    indexing scheme so that an array looks like a list (but does
Chase>    not act like a list for other purposes).

Konrad> The array languages I am familiar with (APL and J) do not
Konrad> permit this.

I forgot about my brief experience with APL-PLUS.

Chase>    As an alternative, a 'flat' (or 'flattened') array attribute
Chase>    could be supported.

Konrad> Why? What's wrong with ravel(a)? You can index its result if
Konrad> you want.

The reason for a 'flat' attribute is that ravel(a) does not support
_assignment_ to 'a' in flattened form.  An attribute or method is a
more natural interface for changing an objects data members.  However,
ravel(a) could provide this functionality if ravel(a) returned a
reference instead of a copy.

The attribute would not fit your functions for everything so that
scalars can be substituted for arrays. But if the flattened array is
to be indexed (for assignment or selection) then scalars could not be
supported anyway.

Chris


=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hinsenk@ere.umontreal.ca  Mon Mar  4 16:37:23 1996
From: hinsenk@ere.umontreal.ca (Konrad HINSEN)
Date: Mon, 4 Mar 1996 11:37:23 -0500
Subject: [PYTHON MATRIX-SIG] RubberIndex
In-Reply-To: <9603041601.AA21958@hurlbut.> (message from Chris Chase S1A on Mon, 4 Mar 1996 11:01:34 +0500)
Message-ID: <199603041637.LAA25988@cyclone.ERE.UMontreal.CA>

> The reason for a 'flat' attribute is that ravel(a) does not support
> _assignment_ to 'a' in flattened form.  An attribute or method is a
> more natural interface for changing an objects data members.  However,
> ravel(a) could provide this functionality if ravel(a) returned a
> reference instead of a copy.

I think that right now it does, but in my opinion it shouldn't, at
least not by default. For assignment in flattened form, my proposal
contains:

  2.1.3) Combining a group of axes into one axis (see comment 2):
  +      a[i1, i2, ......, i3, i4]  (see comment 3)
	   The double ellipsis works similar to the single one, but
	   contracts all the axes covered into a single axis.

This is more flexible, since it allows partially flattened forms,
and follows the principle "assignment only via indexing", which
I might add to the list of principles...

> The attribute would not fit your functions for everything so that
> scalars can be substituted for arrays. But if the flattened array is
> to be indexed (for assignment or selection) then scalars could not be
> supported anyway.

Which is another reason to do all assignments in the form of indexing,
such that indexing is the only operation not supported on scalars.

-------------------------------------------------------------------------------
Konrad Hinsen                     | E-Mail: hinsenk@ere.umontreal.ca
Departement de chimie             | Tel.: +1-514-343-6111 ext. 3953
Universite de Montreal            | Fax:  +1-514-343-7586
C.P. 6128, succ. Centre-Ville     | Deutsch/Esperanto/English/Nederlands/
Montreal (QC) H3C 3J7             | Francais (phase experimentale)
-------------------------------------------------------------------------------

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hinsenk@ere.umontreal.ca  Mon Mar  4 18:49:13 1996
From: hinsenk@ere.umontreal.ca (Konrad HINSEN)
Date: Mon, 4 Mar 1996 13:49:13 -0500
Subject: [PYTHON MATRIX-SIG] Proposal: upward cast operation
Message-ID: <199603041849.NAA03129@cyclone.ERE.UMontreal.CA>

Problem: How do you write a mathematical function that works for
integers, floats, complex numbers, and number classes implemented in
Python? If you think that's easy, look at this example:

  def f(a, b):
    return a/(a+b)

If you call this with integer arguments, it won't do what you think,
because the division operation for integers is different. You might of
course simply say "don't call this with integer arguments", but you
might have to call it with numbers coming from, say, a library
function whose types are not so easy to predict. You could also modify
the code to

  def f(a, b):
    return float(a)/(a+b)

but then it doesn't work for complex arguments, because a gets
replaced by its real part. And for other number types, you don't
even know what float() does. What is needed is a type cast that
acts only "if necessary".


I propose to add two such functions to umath, one to cast to float and
the other to cast to complex. The cast to float should work like
this:
1) If the argument is an integer, cast it to float.
2) If the argument has a suitably named method, call this
   method to do the cast.
3) If neither 1) or 2) apply, return the argument unchanged.

The cast to complex would work similarly, with only the
first step different.

Any comments? Is there a problem I have overlooked? Or is there
a simpler solution to the problem?

-------------------------------------------------------------------------------
Konrad Hinsen                     | E-Mail: hinsenk@ere.umontreal.ca
Departement de chimie             | Tel.: +1-514-343-6111 ext. 3953
Universite de Montreal            | Fax:  +1-514-343-7586
C.P. 6128, succ. Centre-Ville     | Deutsch/Esperanto/English/Nederlands/
Montreal (QC) H3C 3J7             | Francais (phase experimentale)
-------------------------------------------------------------------------------

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From da@maigret.cog.brown.edu  Tue Mar  5 19:44:03 1996
From: da@maigret.cog.brown.edu (David Ascher)
Date: Tue, 5 Mar 1996 14:44:03 -0500 (EST)
Subject: [PYTHON MATRIX-SIG] which fft library should I do?
Message-ID: <199603051944.OAA28722@maigret>

While I have started work on a module to the fft routines in the SGI
complib.sgimath library, I'm thinking that maybe I should do something
which is 1) better tested (there are things like "array of size
2*((n+2)/2)" in the man pages), and 2) more portable (e.g. would work on
my PC).

I've looked around on the web, and there are more FFT packages out there
than there should be. =)  Netlib's FFTPACK is fine, but it's only in
Fortran (the fft.c file doesn't seem to be a straight port -- it seems
to change the function names, for example).

I think that the library used should come in C at least, and in Fortran
if possible, mostly due to the portability problem.  While "serious" fft
users would probably do it on a fast machine w/ a fortran library, I
think that I want to be able to do FFT on MacPython or PythonWin without
a fortran compiler.

I think the first goal of an fft module for Python would be to be
relatively generic and relatively simple.  It should do at least 1, 2
and 3 dims.  It should deal with floats, doubles, and float and double
complex.  

I don't think that I want to worry about routines which are optimized
for, say, multiple even sequences with only odd wave numbers.

Any suggestions?

--david

PS: How bad of a performance hit does one take w/ f2c-output code as
opposed to handcoded C on code like this?


=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hinsenk@ere.umontreal.ca  Tue Mar  5 21:25:36 1996
From: hinsenk@ere.umontreal.ca (Konrad HINSEN)
Date: Tue, 5 Mar 1996 16:25:36 -0500
Subject: [PYTHON MATRIX-SIG] which fft library should I do?
In-Reply-To: <199603051944.OAA28722@maigret> (da@maigret.cog.brown.edu)
Message-ID: <199603052125.QAA12725@cyclone.ERE.UMontreal.CA>

> I think that the library used should come in C at least, and in Fortran
> if possible, mostly due to the portability problem.  While "serious" fft
> users would probably do it on a fast machine w/ a fortran library, I
> think that I want to be able to do FFT on MacPython or PythonWin without
> a fortran compiler.

I agree. I remember having seen a list of mathematical libraries
in C somewhere, which is where you should start looking for
C libraries. I suppose it was in news.answers, but I am not sure.

> PS: How bad of a performance hit does one take w/ f2c-output code as
> opposed to handcoded C on code like this?

That depends a lot on your C compiler and on your application.  Many C
compilers are not very good at standard optimizations for numerical
code. The difficulties caused by the language itself are few: pointer
aliasing (a Fortran compiler may assume that two array arguments
passed to a subroutine do not refer to overlapping memory blocks; a C
compiler may not), the power operator (few C compilers can optimize
e.g. small integer powers) and intrinsic functions (although some C
compilers already come with a good substitute in the form of #pragmas
in math.h and corresponding optimizations).

Another question is whether the code produced by f2c is sufficiently
portable. After all, f2c has to be configured for some features of the
C compiler, and there are C compilers for which this is impossible.
For example, the C compiler must provide two floating-point precisions
of which the larger one uses exactly twice as many bytes as the
smaller one. I remember one compiler (Pure-C for the Atari ST) for
which I could not configure f2c, because "float" takes 4 bytes and
"double" 10.

Another problem is the f2c library. The generic source code is
very Unix-specific. I don't know whether there are any ports
to other operating systems.

All that means that a real C library is best. One can still
have an alternate Fortran library binding for people with
a Fortran compiler and a need for speed. As long as the
high-level interface is the same, few users should see the
difference.

-------------------------------------------------------------------------------
Konrad Hinsen                     | E-Mail: hinsenk@ere.umontreal.ca
Departement de chimie             | Tel.: +1-514-343-6111 ext. 3953
Universite de Montreal            | Fax:  +1-514-343-7586
C.P. 6128, succ. Centre-Ville     | Deutsch/Esperanto/English/Nederlands/
Montreal (QC) H3C 3J7             | Francais (phase experimentale)
-------------------------------------------------------------------------------

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From spillar@uwyo.edu  Wed Mar  6 04:59:45 1996
From: spillar@uwyo.edu (Earl Spillar)
Date: Tue, 5 Mar 96 21:59:45 -0700
Subject: [PYTHON MATRIX-SIG] Efficient data reading
Message-ID: <9603060459.AA00271@galaxies.plk.af.mil>

Gentlepeople:

I'm going to implement some astronomical image processing stuff 

using the Matrix extensions.  I think it's a perfect application for 

Python-  I need to perform arithmatic on 2MB numerical arrays quickly and 

efficiently, while dealing with some simple variables associated with
each array.  I could post more details if there is interest-

Anyway, the question is how to most efficiently read in data already
written to disk in a standard format (FITS).  I   know how to parse
the headers, its  the 2 MB data arrays I'm worried about.  I'm thinking about 

reading the data using the array module, and feeding the result of that to the
Numerical module. Is that reasonably efficient?  It seems like I'll have 2  
copies floating around for a moment. Is there another mechanism
in the Numerical module that I'm missing?  


Thanks for any help- this stuff looks great, and answers needs I've had 

for some time!

Earl Spillar
spillar@uwyo.edu

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From weinhand@unileoben.ac.at  Wed Mar  6 07:54:56 1996
From: weinhand@unileoben.ac.at (Herbert Weinhandl)
Date: Wed, 6 Mar 96 08:54:56 +0100
Subject: [PYTHON MATRIX-SIG] which fft library should I do?
Message-ID: <45891.weinhand@unileoben.ac.at>


[snip]
>All that means that a real C library is best. One can still
>have an alternate Fortran library binding for people with
>a Fortran compiler and a need for speed. As long as the
>high-level interface is the same, few users should see the
>difference.

You should look at th URL

     http://www.tu-chemnitz.de/~arndt/joerg.html

there is e.g. fxt.tgz (C source for FFT and Fast Hartley Transform).
You can find a lot of links to other sites related to this matter.

I hope this helps

Herbert Weinhandl


Institute for Solid State Physics,       Austrian Academy of Sciences,
Institute for Metal Physics,       University for Mining & Metallurgy,
Jahnstr. 12,                !  It is
A-8700 Leoben, Austria      !  NOT
Tel: (+43) 3842-45511-37    !  my bailiwick !
Fax: (+43) 3842-45512-16    !  from Cliff Stoll's  "The Cuckoo's Egg"

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From chris.chase@jhuapl.edu  Wed Mar  6 14:12:28 1996
From: chris.chase@jhuapl.edu (Chris Chase S1A)
Date: Wed, 6 Mar 1996 09:12:28 -0500
Subject: [PYTHON MATRIX-SIG] index of C and C++ numerical software
Message-ID: <199603061515.KAA00253@python.org>


Below is the header of a file containing info on numerical C/C++
software on the net.  It contains pointers to lots of FFT software
among other things.

Chris

Welcome to of the index of resources for numerical computation
in C or C++.  It is a collection of pointers to:

    - free source code available on the net,
    - articles and documents, especially those available over the net.

This file is
   ftp://usc.edu/pub/C-numanal/numcomp-free-c.gz
   ftp://ftp.math.psu.edu/pub/FAQ/numcomp-free-c
or c/numcomp-free-c on netlib (slightly outdated).
Also see the last item on http://www.math.psu.edu/OtherMath.html

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From jjh@Goldilocks.LCS.MIT.EDU  Wed Mar  6 13:29:41 1996
From: jjh@Goldilocks.LCS.MIT.EDU (James Hugunin)
Date: Wed, 6 Mar 96 08:29:41 EST
Subject: [PYTHON MATRIX-SIG] Efficient data reading
In-Reply-To: <9603060459.AA00271@galaxies.plk.af.mil> (message from Earl Spillar on Tue, 5 Mar 96 21:59:45 -0700)
Message-ID: <9603061329.AA06526@baribal.LCS.MIT.EDU.LCS.MIT.EDU>


   From: Earl Spillar <me@galaxies.plk.af.mil>

   I'm going to implement some astronomical image processing stuff 
   using the Matrix extensions.  I think it's a perfect application for 
   Python-  I need to perform arithmatic on 2MB numerical arrays quickly and 
   efficiently, while dealing with some simple variables associated with
   each array.  I could post more details if there is interest-

BTW - has anybody heard anything more about the image module discussed
a while back on this list?  It sounds like it might be very helpful
here.

   Anyway, the question is how to most efficiently read in data already
   written to disk in a standard format (FITS).  I   know how to parse
   the headers, its  the 2 MB data arrays I'm worried about.  I'm thinking about 
   reading the data using the array module, and feeding the result of that to the
   Numerical module. Is that reasonably efficient?  It seems like I'll have 2  
   copies floating around for a moment. Is there another mechanism
   in the Numerical module that I'm missing?  

I explicitly designed the numeric module to not access file objects
(well, there are a couple of hidden methods lying around, but those
wil be going away very soon).  This makes safe code (things like
grail) much easier to think about.  It also should strongly encourage
people to use pickling as their "native" format for storing arrays
which I think is almost always the best choice.  Also, for every case
I've had to deal with, reading data into a string, and then converting
the string to an array works just fine. ie.

data = Numeric.fromString(fp.read(n_bytes), type_of_data)

It is true, this does temporarily require twice as much memory as data
"should" require, and it memcpy's all of that data once.  However, in
comparision to the time required for reading 2MB of data off even a
fast local disk, the memory copies/allocations are negligible.

Almost anything that you do with arrays (like a = a + 2) will
temporarily require this double memory.

(Note to experts, this can actually be written as add(a, 2, a) in
which case you don't need that extra memory, but if you want to write
a lot of code like this, then you should probably be working in C
anyway).

-Jim

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hinsenk@ere.umontreal.ca  Wed Mar  6 14:14:41 1996
From: hinsenk@ere.umontreal.ca (Konrad HINSEN)
Date: Wed, 6 Mar 1996 09:14:41 -0500
Subject: [PYTHON MATRIX-SIG] Efficient data reading
In-Reply-To: <9603060459.AA00271@galaxies.plk.af.mil> (message from Earl Spillar on Tue, 5 Mar 96 21:59:45 -0700)
Message-ID: <199603061414.JAA24129@cyclone.ERE.UMontreal.CA>

> the headers, its  the 2 MB data arrays I'm worried about.  I'm thinking about 
> reading the data using the array module, and feeding the result of that to the
> Numerical module. Is that reasonably efficient?  It seems like I'll have 2  
> copies floating around for a moment. Is there another mechanism
> in the Numerical module that I'm missing?  

There is no difference between the "array module" and the "numerical module".
The module "Numerical" simply imports objects from the array module. Or are
you referring to the old array module?

I see no problem in writing a C function that allocates the array and
loads the data without any copying. However, you will have to take
care that this array is not copied during later processing. Python
is not exactly designed to avoid copying objects.

-------------------------------------------------------------------------------
Konrad Hinsen                     | E-Mail: hinsenk@ere.umontreal.ca
Departement de chimie             | Tel.: +1-514-343-6111 ext. 3953
Universite de Montreal            | Fax:  +1-514-343-7586
C.P. 6128, succ. Centre-Ville     | Deutsch/Esperanto/English/Nederlands/
Montreal (QC) H3C 3J7             | Francais (phase experimentale)
-------------------------------------------------------------------------------

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From fredrik_lundh@ivab.se  Wed Mar  6 21:41:43 1996
From: fredrik_lundh@ivab.se (Fredrik Lundh)
Date: Wed, 6 Mar 1996 22:41:43 +0100
Subject: [PYTHON MATRIX-SIG] Efficient data reading
In-Reply-To: <9603061329.AA06526@baribal.LCS.MIT.EDU.LCS.MIT.EDU>
 (jjh@Goldilocks.LCS.MIT.EDU)
Message-ID: <9603062141.AA20782@arnold.image.ivab.se>


> BTW - has anybody heard anything more about the image module discussed
> a while back on this list?  It sounds like it might be very helpful
> here.

An image-sig have been formed, but not yet activated.  I've been a bit
too busy writing articles and holding seminars on Python...

Anyway, feel free to sign up (image-sig-request@python.org), but don't
expect any activity (not this week, at least :-).  A formal
announcement will be posted to the news group real soon now.

The Python Imaging Library, release 0.1, is nearly completed, and I
hope to release it within a few weeks.  I've even written a handbook
for it...

Regards	/F

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From spillar@uwyo.edu  Wed Mar  6 23:56:14 1996
From: spillar@uwyo.edu (Earl J Spillar)
Date: Wed, 06 Mar 1996 16:56:14 -0700 (MST)
Subject: [PYTHON MATRIX-SIG] Efficient data reading
Message-ID: <MAPI.Id.0016.0070696c6c6172203231363130303042@MAPI.to.RFC822>

Gentlemen- thanks for your answers.  

James Hugunin said: 

	BTW - has anybody heard anything more about the image module discussed
	a while back on this list?  It sounds like it might be very helpful
	here.

Probably will be helpful.  A lot of what astronomers call "image processi=
ng"
is actually numerical analysis though, so the other Matrix stuff is very
important.

	I explicitly designed the numeric module to not access file objects...
	strongly encourage people to use pickling as their "native" format for =

	storing arrays which I think is almost always the best choice..."

I agree completely with this philosophy.  I will certainly keep my data =
  in 
pickled format.  I do have a need to get the data in and out to use "lega=
cy" apps 
though, hence the question. 

	(Note to experts, this can actually be written as add(a, 2, a) in
	which case you don't need that extra memory, but if you want to 
	write a lot of code like this, then you should probably be working
	 in C anyway).

Thanks for the trick.  I WILL be doing a lot of code like this, but it =
needs to 
be "reconfigured" frequently.  I want to prototype in the fluid Python =
environment
and then freeze bottlenecks into C.

Konrad said:
	There is no difference between the "array module" and the 
	"numerical module". The module "Numerical" simply imports 
	objects from the array module. Or are you referring to the old array mod=
ule?

Actually, was thinking about the old array module.  I guess when I saw =
the
Numeric.fromString method, I thought C string, and CR/LF etc, NULLs, and =
thought
it wouldn't work... primitive thinking on my part.

Thanks for the help!
Earl Spillar
spillar@uwyo.edu
http://plains.uwyo.edu/~spillar/


=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From fredrik_lundh@ivab.se  Thu Mar  7 06:54:56 1996
From: fredrik_lundh@ivab.se (Fredrik Lundh)
Date: Thu, 7 Mar 1996 07:54:56 +0100
Subject: [PYTHON MATRIX-SIG] Efficient data reading
In-Reply-To: <MAPI.Id.0016.0070696c6c6172203231363130303042@MAPI.to.RFC822>
 (message from Earl J Spillar on Wed, 06 Mar 1996 16:56:14 -0700 (MST))
Message-ID: <9603070654.AA22905@arnold.image.ivab.se>


> Probably will be helpful.  A lot of what astronomers call "image
> processing" is actually numerical analysis though, so the other
> Matrix stuff is very important.

  Indeed.  One important future task is to provide tight interfaces
between PIL and the matrix extensions.  I'd rather not duplicate stuff
like frequency domain filters, for example.

  On the other hand, a FITS reader should probably be part of PIL
rather than some other module.  I've already hacked a simple version,
but haven't tested it much.  Maybe your module could be plugged in
instead?

	/F

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From spillar@uwyo.edu  Thu Mar  7 16:22:21 1996
From: spillar@uwyo.edu (Earl J Spillar)
Date: Thu, 07 Mar 1996 09:22:21 -0700 (MST)
Subject: [PYTHON MATRIX-SIG] FITS images place in Module Space
Message-ID: <MAPI.Id.0016.0070696c6c6172203042413330303038@MAPI.to.RFC822>

Fredrik Lundh said-

 	On the other hand, a FITS reader should probably 
	be part of PIL rather than some other module.  I've 
	already hacked a simple version, but haven't tested it 
	much.  Maybe your module could be plugged in
	instead?

This makes sense.  I wasn't aware of PIL until these posts.
I'm not sure my module is all that useful yet-  it mostly 
deals with the header parts so far, and calls some legacy
free standing executables for data operations.  

	The Python Imaging Library, release 0.1, is nearly 
	completed, and I hope to release it within a few 
	weeks.  I've even written a handbook for it...

I'ld be very interested in seeing how the handbook!


Earl Spillar
spillar@uwyo.edu
http://plains.uwyo.edu/~spillar/


=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From dubois1@llnl.gov  Thu Mar  7 21:39:28 1996
From: dubois1@llnl.gov (Paul. Dubois)
Date: Thu, 07 Mar 1996 13:39:28 -0800
Subject: [PYTHON MATRIX-SIG] Functions and names
References: <199602202012.PAA17939@cyclone.ERE.UMontreal.CA>
Message-ID: <313F5790.68C0@llnl.gov>

I finally got time to take a look at Konrad's memo about functions
and names for the matrix class. I have no objection to it.
Except, I still want to be able to distinguish those actions which 
modify self and those which return a new array, so that 
x.reshape(s) modifies x, (or else the only way to do it is assignment
to x.shape)
x.shaped(s) returns some new value. 

Likewise with transpose. In short, if the name is or is most likely to
be interpreted as an imperative verb, it means that self is modified,
and no value is returned. 
-- 
Paul F. Dubois, L-472				(510)-422-5426
Lawrence Livermore National Laboratory		FAX (510)-423-9969
Livermore, CA 94550				dubois1@llnl.gov
Consulting: PaulDubois@aol.com

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hinsenk@ere.umontreal.ca  Fri Mar  8 00:08:08 1996
From: hinsenk@ere.umontreal.ca (Konrad HINSEN)
Date: Thu, 7 Mar 1996 19:08:08 -0500
Subject: [PYTHON MATRIX-SIG] Functions and names
In-Reply-To: <313F5790.68C0@llnl.gov> (dubois1@llnl.gov)
Message-ID: <199603080008.TAA21569@cyclone.ERE.UMontreal.CA>

> 
> I finally got time to take a look at Konrad's memo about functions
> and names for the matrix class. I have no objection to it.
> Except, I still want to be able to distinguish those actions which 
> modify self and those which return a new array, so that 

In my proposal there are no operations that modify an array.  I am not
sure they are needed at all. You can change elements by assignment
with indexing, and you can assign to shape.  In-place transposition is
not essential, because transposition returns a reference anyway (which
I discovered only today; I'll update my proposal to make this behaviour
optional, as for reshape()). I'd like to establish the principle that
with exception of indexing, no operation returns a reference by default.
Making a copy leads to fewer surprises and is therefore the better
default option.

In-place operations are more important for add-on packages like
linear algebra, and I agree that the naming scheme should make
the distinction clear. For example, one could have invert(m)
and inverse(m). But for other operations the choice is less
clear, e.g. for singular value decomposition.

-------------------------------------------------------------------------------
Konrad Hinsen                     | E-Mail: hinsenk@ere.umontreal.ca
Departement de chimie             | Tel.: +1-514-343-6111 ext. 3953
Universite de Montreal            | Fax:  +1-514-343-7586
C.P. 6128, succ. Centre-Ville     | Deutsch/Esperanto/English/Nederlands/
Montreal (QC) H3C 3J7             | Francais (phase experimentale)
-------------------------------------------------------------------------------

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From da@maigret.cog.brown.edu  Sat Mar  9 21:05:19 1996
From: da@maigret.cog.brown.edu (David Ascher)
Date: Sat, 9 Mar 1996 16:05:19 -0500 (EST)
Subject: [PYTHON MATRIX-SIG] missing (?) feature
Message-ID: <199603092105.QAA09084@maigret>

I came accross a feature I'd like to see in the "choose"
command/function (or whatever else it gets called =):

Basically, my problem is that I want to do something like:

	ranf = Ranf.ranf
	age = age + 1
	x = age.greater(MAX_AGE).choose(x, ranf)
	y = age.greater(MAX_AGE).choose(y, ranf)
	age = age.greater(MAX_AGE).choose(age, 0)

so that the x and y values of 'old' coordinates get replaced w/ new
coordinates.  The new coordinates are typically based on random numbers.
With the current implementation I have to do:

	x = age.greater(MAX_AGE).choose(x, random_sample(NUM_DOTS))

which is wasteful since on a given iteration, only a few of the dots are
likely to be "too old".  But a new random_sample() array is generated
each time anyway.

--david

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hinsenk@ere.umontreal.ca  Mon Mar 11 14:08:55 1996
From: hinsenk@ere.umontreal.ca (Konrad HINSEN)
Date: Mon, 11 Mar 1996 09:08:55 -0500
Subject: [PYTHON MATRIX-SIG] missing (?) feature
In-Reply-To: <199603092105.QAA09084@maigret> (da@maigret.cog.brown.edu)
Message-ID: <199603111408.JAA11002@cyclone.ERE.UMontreal.CA>

> Basically, my problem is that I want to do something like:
> 
> 	ranf = Ranf.ranf
> 	age = age + 1
> 	x = age.greater(MAX_AGE).choose(x, ranf)
> 	y = age.greater(MAX_AGE).choose(y, ranf)
> 	age = age.greater(MAX_AGE).choose(age, 0)

If you are really worried about efficiency, you should certainly
not recalculate age.greater(MAX_AGE) three times ;-)

> With the current implementation I have to do:
> 
> 	x = age.greater(MAX_AGE).choose(x, random_sample(NUM_DOTS))
> 
> which is wasteful since on a given iteration, only a few of the dots are
> likely to be "too old".  But a new random_sample() array is generated
> each time anyway.

Which "waste" are you worried about? The waste in CPU time caused by
the random generator? Unless your array is really big, this is
probably not worth mentioning.

On the other hand, a rather concise solution could be obtained if
the idea of allowing general list indices is taken up again.
Then you could write:

   update = repeat(greater(age, MAX_AGE), arrayRange(len(age)))
   x[update] = random_sample(len(update))
   y[update] = random_sample(len(update))

-------------------------------------------------------------------------------
Konrad Hinsen                     | E-Mail: hinsenk@ere.umontreal.ca
Departement de chimie             | Tel.: +1-514-343-6111 ext. 3953
Universite de Montreal            | Fax:  +1-514-343-7586
C.P. 6128, succ. Centre-Ville     | Deutsch/Esperanto/English/Nederlands/
Montreal (QC) H3C 3J7             | Francais (phase experimentale)
-------------------------------------------------------------------------------

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From g.k@trulli.imc.akh-wien.ac.at  Tue Mar 12 11:25:04 1996
From: g.k@trulli.imc.akh-wien.ac.at (Guenter Kolousek)
Date: Tue, 12 Mar 1996 11:25:04 GMT
Subject: [PYTHON MATRIX-SIG] Extending NumericalPython by fuzzy numbers?
Message-ID: <9603121125.AA12133@trulli.imc.akh-wien.ac.at>


Hi everybody!

I recently looked at the new NumericalPython. It looks great. For my
purposes I need fuzzy numbers. Is it easy to extend the library by
new functions and especially by new data types, like fuzzy numbers?

There is just a little problem: No experience in extending Python
with C functions! Is there a way for me to implement it with a
reasonable effort and contribute it to the matrix lib? Is it
possible to implement the extensions in C++?

I appreciate any helpful answers.

Guenter Kolousek

-- 
----------------------------------------------------
DI Guenter Kolousek
Department for Medical Computer Sciences
Medical School, University of Vienna
mail: Spitalgasse 23, 1090 Vienna, Austria
email: g.k@trulli.imc.akh-wien.ac.at
phone: +43-1-40400/6664 fax: +43-1-40400/6667
----------------------------------------------------

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From jjh@Goldilocks.LCS.MIT.EDU  Tue Mar 12 16:38:41 1996
From: jjh@Goldilocks.LCS.MIT.EDU (James Hugunin)
Date: Tue, 12 Mar 96 11:38:41 EST
Subject: [PYTHON MATRIX-SIG] Extending NumericalPython by fuzzy numbers?
In-Reply-To: <9603121125.AA12133@trulli.imc.akh-wien.ac.at> (g.k@trulli.imc.akh-wien.ac.at)
Message-ID: <9603121638.AA16842@baribal.LCS.MIT.EDU.LCS.MIT.EDU>


At the moment, I am probably the only person in the world who can
extend the array module with new data types.  This is obviously not
the way I'd like things to be.  If there is an important data type,
with a nice implementation in C, it shouldn't take me much time to add
the appropriate hooks.  I happen to strongly dislike C++, so adding a
C++ object is unlikely.

On the other hand...

How exactly would you define a fuzzy number?  My guess is that a fuzzy
array could probably be implemented fairly easily as a subclass of
UserArray in python, and that you wouldn't take too much of a
performance hit.  Of course, this is just a guess.

-Jim

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hinsenk@ere.umontreal.ca  Tue Mar 12 17:05:05 1996
From: hinsenk@ere.umontreal.ca (Konrad HINSEN)
Date: Tue, 12 Mar 1996 12:05:05 -0500
Subject: [PYTHON MATRIX-SIG] Extending NumericalPython by fuzzy numbers?
In-Reply-To: <9603121638.AA16842@baribal.LCS.MIT.EDU.LCS.MIT.EDU> (jjh@Goldilocks.LCS.MIT.EDU)
Message-ID: <199603121705.MAA10705@cyclone.ERE.UMontreal.CA>

> At the moment, I am probably the only person in the world who can
> extend the array module with new data types.  This is obviously not

Sorry to disappoint you, but what do you think about this:

   Python 1.3 (Mar  4 1996) [C]
   Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
   >>> from Numeric import *
   >>> from Derivatives import *
   >>> a = array([DerivVar(-2.9,0), DerivVar(3.2,1)])
   >>> multiply.reduce(a)
   (-9.28, [3.2, -2.9])

As long as speed is not of prime importance, using general arrays with
arbitrary numeric types seems a very acceptable solution to me.

-------------------------------------------------------------------------------
Konrad Hinsen                     | E-Mail: hinsenk@ere.umontreal.ca
Departement de chimie             | Tel.: +1-514-343-6111 ext. 3953
Universite de Montreal            | Fax:  +1-514-343-7586
C.P. 6128, succ. Centre-Ville     | Deutsch/Esperanto/English/Nederlands/
Montreal (QC) H3C 3J7             | Francais (phase experimentale)
-------------------------------------------------------------------------------

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From dredish@CS.cmu.edu  Wed Mar 13 15:07:15 1996
From: dredish@CS.cmu.edu (David Redish)
Date: Wed, 13 Mar 1996 10:07:15 -0500
Subject: [PYTHON MATRIX-SIG] atanh
Message-ID: <25549.826729635@GS151.SP.CS.CMU.EDU>



I have been unable to find atanh in the python Numeric libraries.
Is it there?

adr

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hinsenk@ere.umontreal.ca  Wed Mar 13 16:33:14 1996
From: hinsenk@ere.umontreal.ca (Konrad HINSEN)
Date: Wed, 13 Mar 1996 11:33:14 -0500
Subject: [PYTHON MATRIX-SIG] atanh
In-Reply-To: <25549.826729635@GS151.SP.CS.CMU.EDU> (message from David Redish on Wed, 13 Mar 1996 10:07:15 -0500)
Message-ID: <199603131633.LAA18578@cyclone.ERE.UMontreal.CA>

> 
> I have been unable to find atanh in the python Numeric libraries.
> Is it there?

I can't find it either. There is one in cmath, which also works
for floats, but of course not for arrays.

-------------------------------------------------------------------------------
Konrad Hinsen                     | E-Mail: hinsenk@ere.umontreal.ca
Departement de chimie             | Tel.: +1-514-343-6111 ext. 3953
Universite de Montreal            | Fax:  +1-514-343-7586
C.P. 6128, succ. Centre-Ville     | Deutsch/Esperanto/English/Nederlands/
Montreal (QC) H3C 3J7             | Francais (phase experimentale)
-------------------------------------------------------------------------------

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hinsenk@ere.umontreal.ca  Wed Mar 13 17:24:18 1996
From: hinsenk@ere.umontreal.ca (Konrad HINSEN)
Date: Wed, 13 Mar 1996 12:24:18 -0500
Subject: [PYTHON MATRIX-SIG] ArrayPrinter.py
Message-ID: <199603131724.MAA23017@cyclone.ERE.UMontreal.CA>

# Array printing function
#
# Written by Konrad Hinsen <hinsenk@ere.umontreal.ca>
# last revision: 1996-3-13
#

import sys
from fast_umath import *
import Numeric

def arrayToString(a, max_line_width = None, precision = None,
		     suppress_small = None):
    if len(a.shape) == 0:
	return str(a[0])

    if max_line_width is None:
	try:
	    max_line_width = sys.output_line_width
	except AttributeError:
	    max_line_width = 77
    if precision is None:
	try:
	    precision = sys.float_output_precision
	except AttributeError:
	    precision = 8
    if suppress_small is None:
	try:
	    suppress_small = sys.float_output_suppress_small
	except AttributeError:
	    suppress_small = 0
    if a.contiguous():
	data = a.reshape(None)
    else:
	data = a.copy().reshape(None)
    type = a.typecode()
    items_per_line = a.shape[-1]
    if type == 'b' or type == '1' or type == 's' or type == 'i' \
       or type == 'l':
	max_str_len = max(len(str(maximum.reduce(data))),
			  len(str(minimum.reduce(data))))
	format = '%' + str(max_str_len) + 'd'
	item_length = max_str_len+1
	format_function = lambda x, f = format: _formatInteger(x, f)
    elif type == 'f' or type == 'd':
	format, item_length = _floatFormat(data, precision, suppress_small)
	format_function = lambda x, f = format: _formatFloat(x, f)
    elif type == 'F' or type == 'D':
	real_format, real_item_length = _floatFormat(data.real, precision,
						     suppress_small, sign=0)
	imag_format, imag_item_length = _floatFormat(data.imaginary, precision,
						     suppress_small, sign=1)
	item_length = real_item_length + imag_item_length + 2
	format_function = lambda x, f1 = real_format, f2 = imag_format: \
			  _formatComplex(x, f1, f2)
    elif type == 'c':
	item_length = 1
	format_function = lambda x: x
    elif type == 'O':
	item_length = max(map(lambda x: len(str(x)), data)) + 1
	format_function = _formatGeneral
    else:
	return str(a)
    final_spaces = (type != 'c')
    line_width = item_length*items_per_line - final_spaces
    if line_width > max_line_width:
	indent = 6
	if indent == item_length:
	    indent = 8
	items_first = (max_line_width+final_spaces)/item_length
	if items_first < 1: items_first = 1
	items_continuation = (max_line_width+final_spaces-indent)/item_length
	if items_continuation < 1: items_continuation = 1
	line_width = max(item_length*items_first,
			 item_length*items_continuation+indent) - final_spaces
	number_of_lines = 1 + (items_per_line-items_first +
			       items_continuation-1)/items_continuation
	line_format = (number_of_lines, items_first, items_continuation,
		       indent, line_width)
    else:
	line_format = (1, items_per_line, 0, 0, line_width)
    return _arrayToString(a, format_function, len(a.shape), line_format)[:-1]

def _floatFormat(data, precision, suppress_small, sign = 0):
    exp_format = 0
    non_zero = abs(Numeric.compress(data.notEqual(0), data))
    if len(non_zero) == 0:
	max_val = 0.
	min_val = 0.
    else:
	max_val = maximum.reduce(non_zero)
	min_val = minimum.reduce(non_zero)
	if max_val >= 1.e12:
	    exp_format = 1
	if not suppress_small and (min_val < 0.0001 or max_val/min_val > 1000.):
	    exp_format = 1
    if exp_format:
	large_exponent = 0 < min_val < 1e-99 or max_val >= 1e100
	max_str_len = 8 + precision + large_exponent
	if sign: format = '%+'
	else: format = '%'
	format = format + str(max_str_len) + '.' + str(precision) + 'e'
	if large_exponent: format = format + '3'
	item_length = max_str_len + 1
    else:
	format = '%.' + str(precision) + 'f'
	precision = min(precision, max(tuple(map(lambda x, p=precision,
						 f=format: _digits(x,p,f),
						 data))))
	max_str_len = len(str(int(max_val))) + precision + 2
	if sign: format = '%#+'
	else: format = '%#'
	format = format + str(max_str_len) + '.' + str(precision) + 'f'
	item_length = max_str_len + 1
    return (format, item_length)

def _digits(x, precision, format):
    s = format % x
    zeros = len(s)
    while s[zeros-1] == '0': zeros = zeros-1
    return precision-len(s)+zeros

def _arrayToString(a, format_function, rank, line_format):
    if rank == 0:
	return str(a[0])
    elif rank == 1:
	s = ''
	items = line_format[1]
	indent = 0
	index = 0
	for j in range(line_format[0]):
	    s = s + indent * ' '
	    for i in range(items):
		s = s + format_function(a[index])
		index = index + 1
		if index == a.shape[0]: break
	    if s[-1] == ' ': s = s[:-1]
	    s = s + '\n'
	    items = line_format[2]
	    indent = line_format[3]
    else:
	s = ''
	for i in range(a.shape[0]-1):
	    s = s + _arrayToString(a[i], format_function, rank-1, line_format)
	    if rank == 3:
		s = s + '\n'
	    elif rank > 3:
		s = s + (rank-3)*(line_format[4]*'-'+'\n')
	s = s + _arrayToString(a[a.shape[0]-1], format_function,
			       rank-1, line_format)
    return s

def _formatInteger(x, format):
    return format % x + ' '

def _formatFloat(x, format, strip_zeros = 1):
    if format[-1] == '3':
	format = format[:-1]
	s = format % x
	third = s[-3]
	if third == '+' or third == '-':
	    s = s[1:-2] + '0' + s[-2:]
    elif format[-1] == 'f':
	s = format % x
	if strip_zeros:
	    zeros = len(s)
	    while s[zeros-1] == '0': zeros = zeros-1
	    s = s[:zeros] + (len(s)-zeros)*' '
    else:
	s = format % x
    return s + ' '

def _formatComplex(x, real_format, imag_format):
    r = _formatFloat(x.real, real_format)[:-1]
    i = _formatFloat(x.imag, imag_format, 0)[:-1]
    spaces = 0
    while r[spaces] == ' ': spaces = spaces + 1
    r = spaces*' ' + '(' + r[spaces:]
    if imag_format[-1] == 'f':
	zeros = len(i)
	while i[zeros-1] == '0': zeros = zeros-1
	i = i[:zeros] + 'j)' + (len(i)-zeros)*' '
    else:
	i = i + 'j)'
    return r + i + ' '

def _formatGeneral(x):
    return str(x) + ' '

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hinsenk@ere.umontreal.ca  Wed Mar 13 17:23:51 1996
From: hinsenk@ere.umontreal.ca (Konrad HINSEN)
Date: Wed, 13 Mar 1996 12:23:51 -0500
Subject: [PYTHON MATRIX-SIG] New array pretty printer
Message-ID: <199603131723.MAA23007@cyclone.ERE.UMontreal.CA>

I have added two new features to the array printer, and I will send
the new version to everyone in a separate message. Since the last
NumericPython distribution did not contain the most recent version
(there were still a few minor bugs), I recommend the current update
to everyone, even those who are not interested in the new features.

The first new feature is support for general object arrays.  This is
rather elementary (str() is called on each element, and the resulting
strings are printed in a neat arrangement), but it is very useful and
also sufficient for any general array with reasonable elements. Of
course in extreme cases (e.g.  when str() for one element returns a
multi-line string) the array output will be a complete mess.

The second new feature is an additional optional parameter
suppress_small that defaults to "false". If set to true (1), then
elements with a very small absolute value in float arrays will not
cause a switch to exponential format (they will be printed as
zeros). This results in a much neater output if these elements are in
fact "numerical zeros", but of course some information is lost.

I'd also like to propose to change the name of the module
"PrettyPrinter" to "ArrayPrinter". After someone sent me
another module called "PrettyPrinter" (which prints
lists etc. in a nice way), I had some problems for a while
until I found out what went wrong. To avoid such problems it
makes sense to choose a very specific name for this module,
and "ArrayPrinter" is certainly much more specific than
"PrettyPrinter".

-------------------------------------------------------------------------------
Konrad Hinsen                     | E-Mail: hinsenk@ere.umontreal.ca
Departement de chimie             | Tel.: +1-514-343-6111 ext. 3953
Universite de Montreal            | Fax:  +1-514-343-7586
C.P. 6128, succ. Centre-Ville     | Deutsch/Esperanto/English/Nederlands/
Montreal (QC) H3C 3J7             | Francais (phase experimentale)
-------------------------------------------------------------------------------

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From jjh@Goldilocks.LCS.MIT.EDU  Wed Mar 13 20:58:14 1996
From: jjh@Goldilocks.LCS.MIT.EDU (James Hugunin)
Date: Wed, 13 Mar 96 15:58:14 EST
Subject: [PYTHON MATRIX-SIG] atanh
In-Reply-To: <199603131633.LAA18578@cyclone.ERE.UMontreal.CA> (hinsenk@ere.umontreal.ca)
Message-ID: <9603132058.AA09651@baribal.LCS.MIT.EDU.LCS.MIT.EDU>


This is an obvious oversight.  As far as I can tell, the inverse
hyperbolic trig functions are part of the standard math library for
doubles, and Konrad's provided them for complex numbers, so I'll just
add a couple lines to my ufunc generator code and they'll be in the
next version.

-Jim

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From davem@magnet.com  Thu Mar 14 22:43:48 1996
From: davem@magnet.com (Dave Mitchell)
Date: Thu, 14 Mar 1996 17:43:48 -0500 (EST)
Subject: [PYTHON MATRIX-SIG] matrix module
Message-ID: <199603142243.RAA19827@lemur.magnet.com>

> 
> 
>   Could someone please give me an url for the current matrix stuff?
> 
> 							thanks-Dave
> 							davem@magnet.com


=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From demars@netcom.com  Fri Mar 15 01:03:53 1996
From: demars@netcom.com (Dennis C. De Mars)
Date: Thu, 14 Mar 1996 17:03:53 -0800
Subject: [PYTHON MATRIX-SIG] matrix module
Message-ID: <v01540b01ad6e722ab7ef@[10.0.2.15]>

>>
>>
>>   Could someone please give me an url for the current matrix stuff?
>>
>> 							thanks-Dave
>> 							davem@magnet.com
>
>
>=================
>MATRIX-SIG  - SIG on Matrix Math for Python
>
>send messages to: matrix-sig@python.org
>administrivia to: matrix-sig-request@python.org
>=================

Same here; perhaps the location could be posted to the mailing list for
those of us who have signed up recently?

- Dennis D.



=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From da@maigret.cog.brown.edu  Sat Mar 16 19:49:16 1996
From: da@maigret.cog.brown.edu (David Ascher)
Date: Sat, 16 Mar 1996 14:49:16 -0500 (EST)
Subject: [PYTHON MATRIX-SIG] Any interest in PC binaries?
Message-ID: <199603161949.OAA27675@maigret>

I've recently gotten a PC, so the first thing I've done (naturally!)
is to get the Numeric extension to work with Python under Windows95,
along w/ the alpha OpenGL, GLU and Glut extensions.  I will also be
looking into integrating the Numeric extension w/ Jim Ahlstrom's DOS
version (though clearly not the OpenGL stuff), as I hate having a ">>>"
prompt but being unable to do "from Numeric import *".

Would there be any interest in my making binaries of these ports
available, or is everyone on the list a pure unixhead?

--david

PS: Thanks to Python, the boundary between unix workstations and pc's is
    blurring -- a fast pentium w/ Python and OpenGL is looking more and
    more like my (r3000) SGI at school.  Well, actually, it's faster.

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From phil@geog.ubc.ca  Sat Mar 16 20:10:55 1996
From: phil@geog.ubc.ca (Phil Austin)
Date: Sat, 16 Mar 1996 12:10:55 -0800
Subject: [PYTHON MATRIX-SIG] Any interest in PC binaries?
In-Reply-To: <199603161949.OAA27675@maigret>
References: <199603161949.OAA27675@maigret>
Message-ID: <199603162010.MAA07296@whimbrel.geog.ubc.ca>

David Ascher writes:
 > I've recently gotten a PC, so the first thing I've done (naturally!)
 > is to get the Numeric extension to work with Python under Windows95,
 > along w/ the alpha OpenGL, GLU and Glut extensions.  I will also be
 > looking into integrating the Numeric extension w/ Jim Ahlstrom's DOS
 > version (though clearly not the OpenGL stuff), as I hate having a ">>>"
 > prompt but being unable to do "from Numeric import *".
 > 
 > Would there be any interest in my making binaries of these ports
 > available, or is everyone on the list a pure unixhead?
 > 
 > --david

One of the main attractions of Python (to us) is the cross-platform
development, and we'd appreciate access to the binaries.  Our hope
is that it can be used as an Octave/Matlab-like teaching tool in our
undergraduate PC lab.

Regards,

Phil Austin		INTERNET: phil@geog.ubc.ca
(604) 822-2175		FAX:	  (604) 822-6150

http://www.geog.ubc.ca/~phil
Associate Professor
Atmospheric Sciences Programme
Geography #217
University of British Columbia
1984 W Mall
Vancouver, BC  V6T 1Z2
CANADA

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From demars@netcom.com  Sun Mar 17 05:05:47 1996
From: demars@netcom.com (Dennis C. De Mars)
Date: Sat, 16 Mar 1996 21:05:47 -0800
Subject: [PYTHON MATRIX-SIG] matrix module
Message-ID: <v01540b00ad714b833cc0@[10.0.2.15]>

>>>
>>>
>>>   Could someone please give me an url for the current matrix stuff?
>>>
>>> 							thanks-Dave
>>> 							davem@magnet.com
>>
>>
>
>Same here; perhaps the location could be posted to the mailing list for
>those of us who have signed up recently?
>
>- Dennis D.
>

As Rosanne Rosanadana used to say, "Never mind." I discovered that an
archive of the entire content of the mailing list (as well as the other
Python lists) is available from Majordomo, which contains the desired URL
plus all of the discussion of Numerical Python which provides very useful
background -- now I won't feel as if I've come in on the middle of a
conversation while reading the traffic on this SIG. I would have realized
this was available if I'd read the info on the Python web site more
carefully.

Anyhow, I suggest to any new subscribers that haven't already done it that
they download the archive for matrix-sig -- over a megabyte and well worth
the effort (...and my apologies to other members of the SIG who will find
this message superfluous, but I think there may be a few other subscribers
out there who are as confused as I was and will find this helpful).

- Dennis D.



=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From spillar@uwyo.edu  Mon Mar 18 04:03:48 1996
From: spillar@uwyo.edu (Earl Spillar)
Date: Sun, 17 Mar 96 21:03:48 -0700
Subject: [PYTHON MATRIX-SIG] PC binaries
Message-ID: <9603180403.AA00503@galaxies.plk.af.mil>

David Ascher asked:

"Would there be any interest in my making binaries of these ports
available, or is everyone on the list a pure unixhead?"

Well, I'ld like to be a pure unix head, but the reality is I need
to work with people who aren't- so I would like to have the ports
available!

Earl Spillar 

spillar@uwyo.edu
http://plains.uwyo.edu/~spillar/

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From GROMA@everx.szbk.u-szeged.hu  Tue Mar 19 12:23:34 1996
From: GROMA@everx.szbk.u-szeged.hu (Groma Geza)
Date: Tue, 19 Mar 1996 12:23:34 MET
Subject: [PYTHON MATRIX-SIG] pickle error on Win95
Message-ID: <9A3698A0A36@everx.szbk.u-szeged.hu>

I  built v0.35 on Win95 by Symantec C++ 7.3. No compilation error
occured. I realized that TestSuite was not updated to this version.
The following error, however, probably  is not related to that.
Running TestPickle resulted in:

pickle.load(fp) ->
Bad result:  EOFError: None
Traceback (innermost last):
  File "<stdin>", line 1, in ?
  File "c:\Python\Lib\ArrayTest\TestPickle.py", line 31, in ?
    do_eval(test, initialize = init)
  File "c:\Python\Lib\ArrayTest\TestUtils.py", line 51, in do_eval
    raise ValueError, "Bad result"
ValueError: Bad result

Is that a bug in the pickling routines, or can be fixed by a proper compiler flag?
This is the hex dump of file 'matrix.save' created by TestPickle: 

4D 69 4C 34   20 32 20 33   20 34 20 0D   0A 00 00 00
00 01 00 00   00 02 00 00   00 03 00 00   00 0D 0A 00
00 00 0B 00   00 00 0C 00   00 00 0D 00   00 00 14 00
00 00 15 00   00 00 16 00   00 00 17 00   00 00 64 00
00 00 65 00   00 00 66 00   00 00 67 00   00 00 6E 00
00 00 6F 00   00 00 70 00   00 00 71 00   00 00 78 00
00 00 79 00   00 00 7A 00   00 00 7B 00   00 00 2E


Geza I. Groma
Institute of Biophysics
Biological Research Centre of Hungarian Academy of Sciences
Szeged, Hungary

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From jjh@Goldilocks.LCS.MIT.EDU  Tue Mar 19 13:16:08 1996
From: jjh@Goldilocks.LCS.MIT.EDU (James Hugunin)
Date: Tue, 19 Mar 96 08:16:08 EST
Subject: [PYTHON MATRIX-SIG] pickle error on Win95
In-Reply-To: <9A3698A0A36@everx.szbk.u-szeged.hu> (GROMA@everx.szbk.u-szeged.hu)
Message-ID: <9603191316.AA19874@baribal.LCS.MIT.EDU.LCS.MIT.EDU>


Your hex dump looks right to me, so I'd guess that the error is
something else.  

I'm surprised that v0.35 compiled on Win95 without any compilation
errors.  I haven't yet implemented any of the patches that others have
told me are needed to get things to compile under windows.  Did you
have to make any changes to the code?

-Jim

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From steve@estel.uindy.edu  Tue Mar 19 13:49:12 1996
From: steve@estel.uindy.edu (Steve Spicklemire)
Date: Tue, 19 Mar 96 08:49:12 -0500
Subject: [PYTHON MATRIX-SIG] pickle error on Win95
In-Reply-To: <9603191316.AA19874@baribal.LCS.MIT.EDU.LCS.MIT.EDU> (jjh@Goldilocks.LCS.MIT.EDU)
Message-ID: <9603191349.AA03021@estel.uindy.edu>


Jim,

>>>>> "James" == James Hugunin <jjh@Goldilocks.LCS.MIT.EDU> writes:

    James> Your hex dump looks right to me, so I'd guess that the
    James> error is something else.

    James> I'm surprised that v0.35 compiled on Win95 without any
    James> compilation errors.  I haven't yet implemented any of the
    James> patches that others have told me are needed to get things
    James> to compile under windows.  Did you have to make any changes
    James> to the code?

Note that he's using the Symantec compiler, rather than MSoft. I don't
have that compiler, so I can't be sure, but all of the patches I made could've
easily been OK on another compiler (e.g., MSoft seems to define 'complex', and
M_PI was not defined.. etc.)

-steve

    James> -Jim

    James> ================= MATRIX-SIG - SIG on Matrix Math for
    James> Python

    James> send messages to: matrix-sig@python.org administrivia to:
    James> matrix-sig-request@python.org =================


=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hinsenk@ere.umontreal.ca  Tue Mar 19 22:13:42 1996
From: hinsenk@ere.umontreal.ca (Konrad HINSEN)
Date: Tue, 19 Mar 1996 17:13:42 -0500
Subject: [PYTHON MATRIX-SIG] Wanted: testers for a module
Message-ID: <199603192213.RAA23768@cyclone.ERE.UMontreal.CA>

This has no direct relation to the Matrix SIG, but since the code I am
talking about works only with the numerics package, I might just as
well restrict the distribution to those who have it.

I have written a module that handles physical quantities with
units. It allows all reasonable mathematical operations on them (while
checking unit compatibility and doing automatic unit conversions) and
can convert between compatible units.

I am looking for people willing to test this. The code itself is not
so much of a problem, but the biggest part of the file is the unit
table, and I am not 100% sure that all entries are correct and that
my collection is sufficiently complete. Anyone interested please
mail me.

Oh yes, there is a relation to arrays: you can use arrays for
the values if you want to :-)

-------------------------------------------------------------------------------
Konrad Hinsen                     | E-Mail: hinsenk@ere.umontreal.ca
Departement de chimie             | Tel.: +1-514-343-6111 ext. 3953
Universite de Montreal            | Fax:  +1-514-343-7586
C.P. 6128, succ. Centre-Ville     | Deutsch/Esperanto/English/Nederlands/
Montreal (QC) H3C 3J7             | Francais (phase experimentale)
-------------------------------------------------------------------------------

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From GROMA@everx.szbk.u-szeged.hu  Wed Mar 20 11:49:19 1996
From: GROMA@everx.szbk.u-szeged.hu (Groma Geza)
Date: Wed, 20 Mar 1996 11:49:19 MET
Subject: [PYTHON MATRIX-SIG] pickle error on Win95
Message-ID: <9BAD7A75EB3@everx.szbk.u-szeged.hu>

> Your hex dump looks right to me, so I'd guess that the error is
> something else.  

Meanwhile I fround that pickle.load() fails if the value of any 
element of an  integer array is 13 (CR!?). This is demonstrated in the 
following example: 
---------------------------------------------------
>>> import pickle
>>> from Numeric import *
>>> def CreateBug(m):
...     fp=open("test","w")
...     pickle.dump(m,fp)
...     fp.close()
...     fp=open("test","r")
...     y=pickle.load(fp)
...     print y
...
>>> CreateBug(array([12,14,15]))
12 14 15
>>> CreateBug(array([12,13,14]))
Traceback (innermost last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 6, in CreateBug
  File "c:\Python\Lib\pickle.py", line 533, in load
    return Unpickler(file).load()
  File "c:\Python\Lib\pickle.py", line 375, in load
    self.dispatch[key](self)
  File "c:\Python\Lib\pickle.py", line 387, in load_eof
    raise EOFError
EOFError
>>>
----------------------------------------------------------------------
 If you have any idea how to fix this error, I am eager to check it on 
my system.

> I'm surprised that v0.35 compiled on Win95 without any compilation
> errors.  I haven't yet implemented any of the patches that others have
> told me are needed to get things to compile under windows.  Did you
> have to make any changes to the code?

Absolutely no change was necessery for Symantec C.
Geza I. Groma
Institute of Biophysics
Biological Research Centre of Hungarian Academy of Sciences
Szeged, Hungary

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From GROMA@everx.szbk.u-szeged.hu  Wed Mar 20 12:03:51 1996
From: GROMA@everx.szbk.u-szeged.hu (Groma Geza)
Date: Wed, 20 Mar 1996 12:03:51 MET
Subject: [PYTHON MATRIX-SIG] pickle error on Win95
Message-ID: <9BB158C6B31@everx.szbk.u-szeged.hu>

> Note that he's using the Symantec compiler, rather than MSoft. I don't
> have that compiler, so I can't be sure, but all of the patches I made could've
> easily been OK on another compiler (e.g., MSoft seems to define 'complex', and
> M_PI was not defined.. etc.)
 
I offer my help in checking  your patches on Symantec C. Could you send 
me the code and the list of compiler errors you have got with MSoft?

 
Geza I. Groma
Institute of Biophysics
Biological Research Centre of Hungarian Academy of Sciences
Szeged, Hungary

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From fredrik_lundh@ivab.se  Wed Mar 20 11:08:34 1996
From: fredrik_lundh@ivab.se (Fredrik Lundh)
Date: Wed, 20 Mar 1996 12:08:34 +0100
Subject: [PYTHON MATRIX-SIG] pickle error on Win95
In-Reply-To: <9BAD7A75EB3@everx.szbk.u-szeged.hu>
 (GROMA@everx.szbk.u-szeged.hu)
Message-ID: <9603201108.AA12490@arnold.image.ivab.se>


...     fp=open("test","w")
...     pickle.dump(m,fp)
...     fp.close()
...     fp=open("test","r")
...     y=pickle.load(fp)
...     print y

 Hey, you've forgot the "b" flag!  The following should work:

...     fp=open("test","wb")
...     pickle.dump(m,fp)
...     fp.close()
...     fp=open("test","rb")
...     y=pickle.load(fp)

  Since text and binary files are not the same thing under DOS (and
some other systems as well), you should always make sure to add "b"
when dealing with binary data.  See open() in the python manual for
details.

	/F

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From guido@CNRI.Reston.VA.US  Wed Mar 20 15:04:59 1996
From: guido@CNRI.Reston.VA.US (Guido van Rossum)
Date: Wed, 20 Mar 1996 10:04:59 -0500
Subject: [PYTHON MATRIX-SIG] pickle error on Win95
In-Reply-To: Your message of "Wed, 20 Mar 1996 12:08:34 +0100."
 <9603201108.AA12490@arnold.image.ivab.se>
References: <9603201108.AA12490@arnold.image.ivab.se>
Message-ID: <199603201505.KAA07841@monty>

>  Hey, you've forgot the "b" flag!  The following should work:
[...]
>   Since text and binary files are not the same thing under DOS (and
> some other systems as well), you should always make sure to add "b"
> when dealing with binary data.  See open() in the python manual for
> details.

On the other hand, pickle *used* to be a text-only format, which is
fine with 'r' and 'b'.  But I presume that numerical arrays may be
written in a more efficient binary form?

--Guido van Rossum <guido@CNRI.Reston.VA.US>
URL: <http://www.python.org/~guido/>

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From jjh@Goldilocks.LCS.MIT.EDU  Wed Mar 20 15:22:55 1996
From: jjh@Goldilocks.LCS.MIT.EDU (James Hugunin)
Date: Wed, 20 Mar 96 10:22:55 EST
Subject: [PYTHON MATRIX-SIG] pickle error on Win95
Message-ID: <9603201522.AA06306@baribal.LCS.MIT.EDU.LCS.MIT.EDU>


   >  Hey, you've forgot the "b" flag!  The following should work:
   [...]
   >   Since text and binary files are not the same thing under DOS (and
   > some other systems as well), you should always make sure to add "b"
   > when dealing with binary data.  See open() in the python manual for
   > details.

   On the other hand, pickle *used* to be a text-only format, which is
   fine with 'r' and 'b'.  But I presume that numerical arrays may be
   written in a more efficient binary form?

   --Guido van Rossum <guido@CNRI.Reston.VA.US>
   URL: <http://www.python.org/~guido/>

I've been waiting for somebody to notice this and properly castigate
me for violating the beauty of pickle's text-only format.

There are some major size and speed savings to be realized by dumping
large arrays in a binary format.  Since dumping 1 MB arrays to disk is
not all that uncommon, these things are unfortunately an issue.

This is the first time that anybody's noticed problems with the binary
format, and it seems a simple enough matter to add warnings that
matrices should only be pickled to binary format files.  Other than
this, I've found the binary format to work quite well for archiving
arbitrary objects that contain matrices across many platforms
(big/little endian) and even for passing these objects across sockets.

Anybody know a way I can add a check to the matrix pickling routines
to determine if they're writing to/reading from a binary format file
and raise an exception otherwise?

-Jim

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From guido@CNRI.Reston.VA.US  Wed Mar 20 15:27:15 1996
From: guido@CNRI.Reston.VA.US (Guido van Rossum)
Date: Wed, 20 Mar 1996 10:27:15 -0500
Subject: [PYTHON MATRIX-SIG] pickle error on Win95
In-Reply-To: Your message of "Wed, 20 Mar 1996 10:22:55 EST."
 <9603201522.AA06306@baribal.LCS.MIT.EDU.LCS.MIT.EDU>
References: <9603201522.AA06306@baribal.LCS.MIT.EDU.LCS.MIT.EDU>
Message-ID: <199603201527.KAA08036@monty>

> I've been waiting for somebody to notice this and properly castigate
> me for violating the beauty of pickle's text-only format.
> 
> There are some major size and speed savings to be realized by dumping
> large arrays in a binary format.  Since dumping 1 MB arrays to disk is
> not all that uncommon, these things are unfortunately an issue.

Agreed.  For large strings, I was going to add this (eventually) as a
speed up extension as well.

> This is the first time that anybody's noticed problems with the binary
> format, and it seems a simple enough matter to add warnings that
> matrices should only be pickled to binary format files.  Other than
> this, I've found the binary format to work quite well for archiving
> arbitrary objects that contain matrices across many platforms
> (big/little endian) and even for passing these objects across sockets.

You must've patched the pickle module, right?

> Anybody know a way I can add a check to the matrix pickling routines
> to determine if they're writing to/reading from a binary format file
> and raise an exception otherwise?

That's easy.  A file object has an attribute 'mode' which is the
read/write open mode.  Of course, pickle can also be used on pseudo
file objects (like StringIO) which don't have this attribute.

--Guido van Rossum <guido@CNRI.Reston.VA.US>
URL: <http://www.python.org/~guido/>

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From drh@oasis.unl.edu  Wed Mar 20 17:07:35 1996
From: drh@oasis.unl.edu (Doug Heisterkamp)
Date: Wed, 20 Mar 1996 11:07:35 -0600 (CST)
Subject: [PYTHON MATRIX-SIG] LAPACK access module v.0.02 is available
Message-ID: <199603201707.LAA23052@oasis.unl.edu>

Hi,

The second version of the python modules for the low-level access to the
LAPACK libraries is now available at
ftp.cs.unl.edu
in
/pub/drh/python/pylapack.0.02.tar.gz


Some of the changes from version 0.01

* Removed reference to f2c.h -- easier to link to fortran libraries
* Fixed a mistake in reference counting.
* Doc strings have been removed.
* Modules have been split up based on first three letters of function names.
* Functions return an exception if the arrays are not contiguous or of the 
  wrong type
* LinAlg.py from Konrad Hinsen has been added to the distribution.

Doug Heisterkamp
drh@oasis.unl.edu



=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From GROMA@everx.szbk.u-szeged.hu  Thu Mar 21 16:15:30 1996
From: GROMA@everx.szbk.u-szeged.hu (Groma Geza)
Date: Thu, 21 Mar 1996 16:15:30 MET
Subject: [PYTHON MATRIX-SIG] compiling v0.35 by Symantec C
Message-ID: <9D7483D064B@everx.szbk.u-szeged.hu>

 Steve Spicklemire wrote:

        > Here is my original note to Jim. I also have diffs around 
        > somewhere.
        > 
        > -steve
        > 
        > --------
        > 
        > OK... well it took a lot longer than I would've figured
        > to get python compiling and running under windows.. but
        > once I got that.. the matrix module worked without much
        > change. The one that stumped me for a bit was endless
        > complaints about the 'complex' type. After much gnashing
        > of teeth it turns out that MSoft defines it's own complex
        > type in <math.h> so..... if you include "mymath.h" before
        > "allobjects.h" in any module/object that deals with the complex
        > type, then all is well.

Math.h of Symantec C  includes complex in the form:

struct complex
{
   double x,y;
};

This did not conflict with Konrad Hinsen's  allobjects.h and
complexobject.h distributed in v0.35.

        > Also, the Windows port needs
        > 
        > HAVE_HYPOT
        > 
        > defined in config.h for the math modules to build without
        > complaint.

I used config.h distributed in the latest version of PythonWin. That defines HAVE_HYPOT.

   > Finally, M_PI needs to be defined as well.

Symantec math.h includes

#define PI		3.14159265358979323846
#define	M_PI		PI

In addition M_PI is defined  in umathmodule.c, fast_umathmodule.c and
cmathmodule.c of v0.35.



Geza I. Groma
Institute of Biophysics
Biological Research Centre of Hungarian Academy of Sciences
Szeged, Hungary

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From GROMA@everx.szbk.u-szeged.hu  Thu Mar 21 14:50:36 1996
From: GROMA@everx.szbk.u-szeged.hu (Groma Geza)
Date: Thu, 21 Mar 1996 14:50:36 MET
Subject: [PYTHON MATRIX-SIG] pickle error on Win95
Message-ID: <9D5DDCA3BB6@everx.szbk.u-szeged.hu>

> I've been waiting for somebody to notice this and properly castigate
> me for violating the beauty of pickle's text-only format.
> 
> There are some major size and speed savings to be realized by dumping
> large arrays in a binary format.  Since dumping 1 MB arrays to disk is
> not all that uncommon, these things are unfortunately an issue.
> 
> This is the first time that anybody's noticed problems with the binary
> format, and it seems a simple enough matter to add warnings that
> matrices should only be pickled to binary format files.  Other than
> this, I've found the binary format to work quite well for archiving
> arbitrary objects that contain matrices across many platforms
> (big/little endian) and even for passing these objects across sockets.
> 
> Anybody know a way I can add a check to the matrix pickling routines
> to determine if they're writing to/reading from a binary format file
> and raise an exception otherwise?
> 
> -Jim

I completely agree with the binary format for arrays. Is there any 
system where the "b" flag in open() causes problem? If not, I suggest to include 
this flag in TestPickle.py.

BTW could you upgrade TestSuite to be compatible 
with v0.35? I realized that in this version nonzero() does not return 
None. This makes sense, but in this case I really miss a special object 
representing an empty array, like [] or () for an empty list or tuple. 
Matlab introduces [] for that, and it is very extensively used there.



Geza I. Groma
Institute of Biophysics
Biological Research Centre of Hungarian Academy of Sciences
Szeged, Hungary

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hinsenk@ere.umontreal.ca  Thu Mar 21 16:24:09 1996
From: hinsenk@ere.umontreal.ca (Konrad HINSEN)
Date: Thu, 21 Mar 1996 11:24:09 -0500
Subject: [PYTHON MATRIX-SIG] pickle error on Win95
In-Reply-To: <9D5DDCA3BB6@everx.szbk.u-szeged.hu> (GROMA@everx.szbk.u-szeged.hu)
Message-ID: <199603211624.LAA29075@cyclone.ERE.UMontreal.CA>

> None. This makes sense, but in this case I really miss a special object 
> representing an empty array, like [] or () for an empty list or tuple. 
> Matlab introduces [] for that, and it is very extensively used there.

array() should accept empty lists in its arguments. Then array([])
would be a rank-1 array of length zero, array([[],[]]) a rank-2 array
of shape (2,0) and so on.  A single "empty array" does not make sense,
since there can be many empty arrays that differ in shape.  Matlab can
get away with that because its matrix concept is much more limited.

-------------------------------------------------------------------------------
Konrad Hinsen                     | E-Mail: hinsenk@ere.umontreal.ca
Departement de chimie             | Tel.: +1-514-343-6111 ext. 3953
Universite de Montreal            | Fax:  +1-514-343-7586
C.P. 6128, succ. Centre-Ville     | Deutsch/Esperanto/English/Nederlands/
Montreal (QC) H3C 3J7             | Francais (phase experimentale)
-------------------------------------------------------------------------------

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hinsenk@ere.umontreal.ca  Mon Mar 25 13:29:36 1996
From: hinsenk@ere.umontreal.ca (Konrad HINSEN)
Date: Mon, 25 Mar 1996 08:29:36 -0500
Subject: [PYTHON MATRIX-SIG] Re: empty array
In-Reply-To: <9EF360E2F63@everx.szbk.u-szeged.hu> (GROMA@everx.szbk.u-szeged.hu)
Message-ID: <199603251329.IAA16483@cyclone.ERE.UMontreal.CA>

>  
>         > array() should accept empty lists in its arguments. Then array([])
>         > would be a rank-1 array of length zero, array([[],[]]) a rank-2 array
>         > of shape (2,0) and so on. 
> 
> That is what I expected, too, but it does not work, at least on my 
> system (built from v0.35). What is wrong in this code?

I know it doesn't work. When I wrote "it should work" I didn't mean
"I think it works", but "I think it ought to work". Keep in mind
that the array module is neither finished nor bug-free.

> Even if array([]) were correct, that would be useful only to create 
> an empty array, and not to test it. In TestUtils.py I found a simple 
> and natural way to check the equality of array a and b:
> 
> 	     a.notEqual(b).nonzero() == None

I must confess that I never understood what nonzero() is good
for. Now I am beginning to realize its use. The name is
rather misleading...

Anyway, to test the equality of two arrays, of course
   a == b
ought to work. Currently it seems to be equivalent to
   a is b
which is against standard Python conventions. Unfortunately
there is no way to give a reasonable meaning to a > b
and a < b, but they are much less important in practice.

Supposing that a == b does what everybody expects it to
do, you can then use it to test for a specific form
of an empty array by writing
    a == array([])
    a == array([[]])
and so on. To test for general emptyness, i.e. to test if
an array has zero elements, you can write
    ravel(a) == array([])

> Another problem is that an empty array is not a printable object:

I know, but there is no point in trying to fix this as long
as many operations don't work properly on empty arrays. The
expression
   maximum.reduce(data)
for example should not raise an error if "data" is empty,
but return the smallest representable number of the type
of "data".

-------------------------------------------------------------------------------
Konrad Hinsen                     | E-Mail: hinsenk@ere.umontreal.ca
Departement de chimie             | Tel.: +1-514-343-6111 ext. 3953
Universite de Montreal            | Fax:  +1-514-343-7586
C.P. 6128, succ. Centre-Ville     | Deutsch/Esperanto/English/Nederlands/
Montreal (QC) H3C 3J7             | Francais (phase experimentale)
-------------------------------------------------------------------------------

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From GROMA@everx.szbk.u-szeged.hu  Fri Mar 22 16:11:05 1996
From: GROMA@everx.szbk.u-szeged.hu (Groma Geza)
Date: Fri, 22 Mar 1996 16:11:05 MET
Subject: [PYTHON MATRIX-SIG] empty array
Message-ID: <9EF360E2F63@everx.szbk.u-szeged.hu>

Konrad Hinsen writes:
 
        > array() should accept empty lists in its arguments. Then array([])
        > would be a rank-1 array of length zero, array([[],[]]) a rank-2 array
        > of shape (2,0) and so on. 

That is what I expected, too, but it does not work, at least on my 
system (built from v0.35). What is wrong in this code?
------------------------------------------------------------------- 
>>> from Numeric import *
>>> array([])
Traceback (innermost last):
  File "<stdin>", line 1, in ?
TypeError: illegal argument type for built-in operation
>>> 
-------------------------------------------------------------------

        > A single "empty array" does not make sense,
        > since there can be many empty arrays that differ in shape.  Matlab can
        > get away with that because its matrix concept is much more limited.

Even if array([]) were correct, that would be useful only to create 
an empty array, and not to test it. In TestUtils.py I found a simple 
and natural way to check the equality of array a and b:

	     a.notEqual(b).nonzero() == None

In v0.35 this returns false. The equality can be tested by

	    len(a.notEqual(b).nonzero()) == 0

but I personally prefer the previous style. None is a 'general empty 
object', something similar could be introduced for arrays, too.
Another problem is that an empty array is not a printable object:

--------------------------------------------------------------
>>> array([0]).nonzero()
Traceback (innermost last):
  File "<stdin>", line 1, in ?
  File "./PrettyPrinter.py", line 28, in arrayToString
    max_str_len = max(len(str(maximum.reduce(data))),
ArrayError: can't take anything from an empty array
>>> 
-----------------------------------------------------------------

 


Geza I. Groma
Institute of Biophysics
Biological Research Centre of Hungarian Academy of Sciences
Szeged, Hungary

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From tbyang@icf.llnl.gov  Mon Mar 25 18:45:05 1996
From: tbyang@icf.llnl.gov (Tser-Yuan BrianYang)
Date: Mon, 25 Mar 96 10:45:05 PST
Subject: [PYTHON MATRIX-SIG] PrettyPrinter problem
Message-ID: <9603251845.AA05868@icf.llnl.gov>

The following may have been posted or even corrected. If so, I apologize
for sending junk mail.

The PrettyPrinter in the numeric package seems to have trouble printing
a float or double array with only one element, i.e.,

>>> a=zeros(1,'d')
>>> a

Traceback (innermost last):
  File "<stdin>", line 1, in ?
  File "/dist/basis/Python/Python-1.3b/lib/python/numeric/PrettyPrinter.py", lin
e 34, in arrayToString
    format, item_length = _floatFormat(data, precision)
  File "/dist/basis/Python/Python-1.3b/lib/python/numeric/PrettyPrinter.py", lin
e 91, in _floatFormat
    precision = min(precision, apply(max, tuple(map(lambda x, p=precision,
TypeError: min() or max() of non-sequence

				Brian Yang

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From jjh@Goldilocks.LCS.MIT.EDU  Mon Mar 25 19:35:52 1996
From: jjh@Goldilocks.LCS.MIT.EDU (James Hugunin)
Date: Mon, 25 Mar 96 14:35:52 EST
Subject: [PYTHON MATRIX-SIG] Re: empty array
In-Reply-To: <199603251329.IAA16483@cyclone.ERE.UMontreal.CA> (hinsenk@ere.umontreal.ca)
Message-ID: <9603251935.AA23372@baribal.LCS.MIT.EDU.LCS.MIT.EDU>


   From: hinsenk@ere.umontreal.ca (Konrad HINSEN)

   >  
   >         > array() should accept empty lists in its arguments. Then array([])
   >         > would be a rank-1 array of length zero, array([[],[]]) a rank-2 array
   >         > of shape (2,0) and so on. 
   > 
   > That is what I expected, too, but it does not work, at least on my 
   > system (built from v0.35). What is wrong in this code?

   I know it doesn't work. When I wrote "it should work" I didn't mean
   "I think it works", but "I think it ought to work". Keep in mind
   that the array module is neither finished nor bug-free.

I made the obvious patches to get this to work and noticed that
array([]) creates an empty array of characters (This is the lowest
type in the type hierarchy).  This is probably not what people want in
the general case.  Any suggestions on how to deal with the type of an
empty array?

-Jim

BTW - I'm making these patches in preparation for one a final 0.36
release containing a fairly large number of bug fixes.  After that I
plan to start work on v0.40 which will involve switching over to much
of Konrad's proposed naming conventions.



=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hinsenk@ere.umontreal.ca  Mon Mar 25 20:13:33 1996
From: hinsenk@ere.umontreal.ca (Konrad HINSEN)
Date: Mon, 25 Mar 1996 15:13:33 -0500
Subject: [PYTHON MATRIX-SIG] PrettyPrinter problem
In-Reply-To: <9603251845.AA05868@icf.llnl.gov> (tbyang@icf.llnl.gov)
Message-ID: <199603252013.PAA26408@cyclone.ERE.UMontreal.CA>

> The PrettyPrinter in the numeric package seems to have trouble printing
> a float or double array with only one element, i.e.,
> 
> >>> a=zeros(1,'d')
> >>> a

That has been fixed a long time ago, but somehow the fixed
version did not propagate far from me :-(

Anyway, the updated version I sent to the list some time
ago should not have that bug. If anyone didn't get it
or lost it, please contact me. (For identification: I am
talking about the version that can print general arrays.)

-------------------------------------------------------------------------------
Konrad Hinsen                     | E-Mail: hinsenk@ere.umontreal.ca
Departement de chimie             | Tel.: +1-514-343-6111 ext. 3953
Universite de Montreal            | Fax:  +1-514-343-7586
C.P. 6128, succ. Centre-Ville     | Deutsch/Esperanto/English/Nederlands/
Montreal (QC) H3C 3J7             | Francais (phase experimentale)
-------------------------------------------------------------------------------

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hinsenk@ere.umontreal.ca  Mon Mar 25 20:25:29 1996
From: hinsenk@ere.umontreal.ca (Konrad HINSEN)
Date: Mon, 25 Mar 1996 15:25:29 -0500
Subject: [PYTHON MATRIX-SIG] Re: empty array
In-Reply-To: <9603251935.AA23372@baribal.LCS.MIT.EDU.LCS.MIT.EDU> (jjh@Goldilocks.LCS.MIT.EDU)
Message-ID: <199603252025.PAA28420@cyclone.ERE.UMontreal.CA>

> I made the obvious patches to get this to work and noticed that
> array([]) creates an empty array of characters (This is the lowest
> type in the type hierarchy).  This is probably not what people want in
> the general case.  Any suggestions on how to deal with the type of an
> empty array?

Of course explicit type specifications should work as expected.
For the default type, I am surprised that "character" is
in the hierarchy at all. Character arrays behave differently
and are not coerced to number arrays. They should therefore
be a separate category. The default type for empty arrays
would then be "integer", which is fine.

-------------------------------------------------------------------------------
Konrad Hinsen                     | E-Mail: hinsenk@ere.umontreal.ca
Departement de chimie             | Tel.: +1-514-343-6111 ext. 3953
Universite de Montreal            | Fax:  +1-514-343-7586
C.P. 6128, succ. Centre-Ville     | Deutsch/Esperanto/English/Nederlands/
Montreal (QC) H3C 3J7             | Francais (phase experimentale)
-------------------------------------------------------------------------------

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From tommy@archive.cs.virginia.edu  Wed Mar 27 17:58:27 1996
From: tommy@archive.cs.virginia.edu (tommy@archive.cs.virginia.edu)
Date: Wed, 27 Mar 1996 12:58:27 -0500
Subject: [PYTHON MATRIX-SIG] FAQ?
Message-ID: <9603271758.AA25053@viper.cs.Virginia.EDU>

Hi,
	I just hitched up on this list looking for info on the Matrix
extension(s) to Python and was wondering if there's a FAQ before I
start asking questions.  Thanks,

					-------> Tommy.

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hinsenk@ere.umontreal.ca  Thu Mar 28 14:11:34 1996
From: hinsenk@ere.umontreal.ca (Konrad HINSEN)
Date: Thu, 28 Mar 1996 09:11:34 -0500
Subject: [PYTHON MATRIX-SIG] Slices
Message-ID: <199603281411.JAA26035@cyclone.ERE.UMontreal.CA>

The recently introduced slice notation (a:b etc.) has greatly improved
readability of slice indexing, but is has also lead to the disappearance
of the old Slice() objects (they are still there, but are not accepted
as indices any more) and thereby important functionality: it is no
longer possible to construct index expressions containing slices
dynamically.

For those who wonder why anyone might want to do this, I'll describe
my application: I have written a class that represents a function
defined on a grid, with linear interpolation for arguments between the
grid points. Of course it should work for functions of any number of
arguments. A crucial step in the interpolation is the extraction of
the subarray of neighbouring grid points, i.e. a subarray of length 2
along any axis. It is no problem to calculate the first/last indices
for each axis, but there is currently no way to construct an indexing
expression with slices, because the : notation is legal only inside
square brackets.

There are basically three possible solutions:

1) Make the : notation legal everywhere. That would make slice objects
   first-class objects like anything else in Python. You could create
   them, assign them to variables, make them elements of lists, tuples,
   or arrays, etc. It would then make sense to make them real sequence
   objects that can be subscripted, used in for-loops, converted to
   lists or tuples etc.

2) Reintroduce the old Slice() notation for the new slice objects.
   The consequences would be the same as above, but with a less
   uniform syntax. I don't really see the point of doing this.

3) Keep slice objects restricted to index expressions, but create
   some way to make them act on a dynamically specified axis. Then
   the example given above could be handled by iteratively indexing
   along the axes. Less elegant, but better than nothing.

My personal favourite is 1), and I can't see any disadvantage in
this. But that makes me think about why slice objects were restricted
to subscripts in the first place. Was there a good reason for that, or
was it just the desire to make the smallest possible change to Python
syntax?

-------------------------------------------------------------------------------
Konrad Hinsen                     | E-Mail: hinsenk@ere.umontreal.ca
Departement de chimie             | Tel.: +1-514-343-6111 ext. 3953
Universite de Montreal            | Fax:  +1-514-343-7586
C.P. 6128, succ. Centre-Ville     | Deutsch/Esperanto/English/Nederlands/
Montreal (QC) H3C 3J7             | Francais (phase experimentale)
-------------------------------------------------------------------------------

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hinsenk@ere.umontreal.ca  Thu Mar 28 14:11:34 1996
From: hinsenk@ere.umontreal.ca (Konrad HINSEN)
Date: Thu, 28 Mar 1996 09:11:34 -0500
Subject: [PYTHON MATRIX-SIG] Slices
Message-ID: <199603281411.JAA26035@cyclone.ERE.UMontreal.CA>

The recently introduced slice notation (a:b etc.) has greatly improved
readability of slice indexing, but is has also lead to the disappearance
of the old Slice() objects (they are still there, but are not accepted
as indices any more) and thereby important functionality: it is no
longer possible to construct index expressions containing slices
dynamically.

For those who wonder why anyone might want to do this, I'll describe
my application: I have written a class that represents a function
defined on a grid, with linear interpolation for arguments between the
grid points. Of course it should work for functions of any number of
arguments. A crucial step in the interpolation is the extraction of
the subarray of neighbouring grid points, i.e. a subarray of length 2
along any axis. It is no problem to calculate the first/last indices
for each axis, but there is currently no way to construct an indexing
expression with slices, because the : notation is legal only inside
square brackets.

There are basically three possible solutions:

1) Make the : notation legal everywhere. That would make slice objects
   first-class objects like anything else in Python. You could create
   them, assign them to variables, make them elements of lists, tuples,
   or arrays, etc. It would then make sense to make them real sequence
   objects that can be subscripted, used in for-loops, converted to
   lists or tuples etc.

2) Reintroduce the old Slice() notation for the new slice objects.
   The consequences would be the same as above, but with a less
   uniform syntax. I don't really see the point of doing this.

3) Keep slice objects restricted to index expressions, but create
   some way to make them act on a dynamically specified axis. Then
   the example given above could be handled by iteratively indexing
   along the axes. Less elegant, but better than nothing.

My personal favourite is 1), and I can't see any disadvantage in
this. But that makes me think about why slice objects were restricted
to subscripts in the first place. Was there a good reason for that, or
was it just the desire to make the smallest possible change to Python
syntax?

-------------------------------------------------------------------------------
Konrad Hinsen                     | E-Mail: hinsenk@ere.umontreal.ca
Departement de chimie             | Tel.: +1-514-343-6111 ext. 3953
Universite de Montreal            | Fax:  +1-514-343-7586
C.P. 6128, succ. Centre-Ville     | Deutsch/Esperanto/English/Nederlands/
Montreal (QC) H3C 3J7             | Francais (phase experimentale)
-------------------------------------------------------------------------------

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From huntd@pocc.gpsmet.ucar.edu  Thu Mar 28 16:40:25 1996
From: huntd@pocc.gpsmet.ucar.edu (Doug Hunt)
Date: Thu, 28 Mar 1996 09:40:25 -0700 (MST)
Subject: [PYTHON MATRIX-SIG] Where is the Numerical Python extension?
Message-ID: <Pine.SOL.3.91.960328093704.21366F-100000@pocc>

Hi all:  I looked at the short postscript paper on Numerical Python on 
www.python.org and it looked like just the thing I need for numerical 
programming project I've got coming up (plus I wanted to learn python).

The trouble is that after having looked all over www.python.org, I can't 
find the bloody thing.  In the paper there is reference to a beta version 
having been released.  Can anyone point me in the right direction?

Many thanks, 

  Doug Hunt


dhunt@ucar.edu
GPS/MET project
Tel. (303) 497-2611


=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hugunin@mit.edu  Fri Mar 29 16:18:17 1996
From: hugunin@mit.edu (Jim Hugunin)
Date: Fri, 29 Mar 1996 11:18:17 -0500
Subject: [PYTHON MATRIX-SIG] Re: building problems on DEC Alphas
References: <4jfiab$f18@csnews.cs.colorado.edu>
Message-ID: <315C0D49.41C67EA6@mit.edu>

Both of these issues are related entirely to the Numerical extension and
should really be discussed in the matrix-sig. I hate to sound like a net
cop, but the main reason for this is that I pay a great deal of
attention to bugs reported to the sig, while I skip many of the postings
to the main newsgroup.  

Your problem lies in ofuncobject.c, and if you add the following line to
the top of this file, this problem should go away.

#define HAVE_FINITE

(Interestingly enough, I just ran into this problem myself this morning
as I was trying to get some code to run on our alcors).

As to your qeustion about cluster analysis, I'd be interested to hear
what answers you get.

-Jim


Carlos Maltzahn wrote:

Does anybody know about cluster analysis software that could be easily
integrated into Numerical Python? Or even better, is there already
such a module out there?

> 
> I tried to build Python on a DEC Alpha (DEC OSF/1 V3.2A  (Rev. 17)).
> During linking I get the following error message:
> 
> ld:
> Unresolved:
> CHECK
> *** Exit 1
> Stop.
> *** Exit 1
> Stop.
> 
> After doing a grep CHECK Modules/*.c I get many modules that define
> CHECK as a macro. Does anybody has an idea what's wrong?
> 
> Any comments are very appreciated!
> Carlos
> 
> --
> #   Carlos Maltzahn             University of Colorado at Boulder
> #   carlosm@cs.colorado.edu     Department of Computer Science
> #   FAX: ++1-303-492-2844       Campus Box 430, Boulder, CO 80309-0430
> #   phone:           8709       http://www.cs.colorado.edu/~carlosm/

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From huntd@pocc.gpsmet.ucar.edu  Fri Mar 29 16:55:38 1996
From: huntd@pocc.gpsmet.ucar.edu (Doug Hunt)
Date: Fri, 29 Mar 1996 09:55:38 -0700 (MST)
Subject: [PYTHON MATRIX-SIG] Thanks
Message-ID: <Pine.SOL.3.91.960329095323.21366L-100000@pocc>

Hi all:  Thanks for the quick replies regarding the location of Numeric 
Python.  I downloaded it and was able to get it up and running (flawless 
build!) on my Linux machine at home.

A few quick experiments lead me to believe that Numeric Python will do 
everything that I need.

Keep up the good work!

Doug Hunt

dhunt@ucar.edu
GPS/MET project
Tel. (303) 497-2611


=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From jjh@Goldilocks.LCS.MIT.EDU  Fri Mar 29 18:48:36 1996
From: jjh@Goldilocks.LCS.MIT.EDU (James Hugunin)
Date: Fri, 29 Mar 96 13:48:36 EST
Subject: [PYTHON MATRIX-SIG] Floating point exceptions on DEC alpha
Message-ID: <9603291848.AA00977@baribal.LCS.MIT.EDU.LCS.MIT.EDU>


I've recently started running some fairly demanding code on our DEC
alphas (using Numeric python of course) and I've run into a very
annoying piece of behavior.  If I do a division by zero, instead of
returning an IEEE Infinity value, an exception is raised and I'm
thrown out of python entirely.  You'll have to take my word for the
fact that these particular divide by zeros are not in fact a bug in my
code, but something that is worth catching later.

Here's a simple example:

On a Sparc 10 (and most other machines I've worked with)

>>> from Numeric import *
>>> array(1.)/0
Infinity
>>>

On a DEC alpha

>>> from Numeric import *
>>> array(1.)/0
Floating exception
(Dumped back to the shell)

What I'd like to do is find a compiler flag, environment variable, or
whatever that would make the alpha behave like the Sparc 10 in this
and similar cases.  Does anybody have any hints?

-Jim


=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From carlosm@anchor.cs.colorado.edu  Fri Mar 29 21:59:03 1996
From: carlosm@anchor.cs.colorado.edu (Carlos Maltzahn)
Date: Fri, 29 Mar 1996 14:59:03 -0700 (MST)
Subject: [PYTHON MATRIX-SIG] Are the matrix-sig articles archived?
Message-ID: <199603292159.OAA12556@anchor.cs.colorado.edu>

If so, could somebody tell me where the archive is?

Thanks,
Carlos

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From carlosm@anchor.cs.colorado.edu  Sun Mar 31 02:30:11 1996
From: carlosm@anchor.cs.colorado.edu (Carlos Maltzahn)
Date: Sat, 30 Mar 1996 19:30:11 -0700 (MST)
Subject: [PYTHON MATRIX-SIG] max_element array method
Message-ID: <199603310230.TAA25619@anchor.cs.colorado.edu>

I don't know whether this has been discussed before because I have yet
to find the matrix-sig archive. I'm currently implementing some clustering 
algorithms and came across two features that would be very helpful to
me:

1. A space-efficient implementation of a symmetric matrix object, and

2. a max_elem() and min_elem() method that would return the tuple
   (max_elem, index). For example:

   > from Numeric import *
   > m == zeros(3, 3, 2)
   > m[2, 0, 1] = 12.04
   > m.max_elem()
   > (12.04, (2, 0, 1))
   > m.min_elem()
   > (0.0, (2, 2, 1))
   > m[2, 0].max_elem()
   > (12.04, (1,))

Currently, I'm using a Python class that does just that. But a C-level 
implementation would be probably faster and more space-efficient.

Comments?

Carlos

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hinsenk@ere.umontreal.ca  Sun Mar 31 14:50:40 1996
From: hinsenk@ere.umontreal.ca (Konrad HINSEN)
Date: Sun, 31 Mar 1996 09:50:40 -0500
Subject: [PYTHON MATRIX-SIG] max_element array method
In-Reply-To: <199603310230.TAA25619@anchor.cs.colorado.edu> (message from Carlos Maltzahn on Sat, 30 Mar 1996 19:30:11 -0700 (MST))
Message-ID: <199603311450.JAA27508@cyclone.ERE.UMontreal.CA>

> I don't know whether this has been discussed before because I have yet
> to find the matrix-sig archive. I'm currently implementing some clustering 
> algorithms and came across two features that would be very helpful to
> me:
> 
> 1. A space-efficient implementation of a symmetric matrix object, and

That is not so difficult. The most straightforward way is to define
symmetric matrices as a Python class and use a one-dimensional array
object as the data representation. The most reasonable arrangement is
the packed format used by LAPACK, and of course by using it you have
immediate access to all the linear algebra functions from that
library. All the elementwise operations can be mapped directly on the
internal representation. Indexing is straightforward. Matrix
multiplication has to be rewritten, and is a bit tricky, since the
product of two symmetric matrices is in general not a symmetric
matrix.

But if you want full compatibility with ordinary arrays, the
implementation gets complicated. Slices, for example, are messy.  So
are reduction operations, for example. But these operations don't make
much sense for symmetric matrices anyway. So the best solution is not
to pretend that symmetric matrices are a special case of general
arrays and implement only a meaningful subset of operations.

> 2. a max_elem() and min_elem() method that would return the tuple
>    (max_elem, index). For example:

Right, there is very little support now for efficient determination
of specific indices. I had a similar problem recently with my
class for function interpolation: finding the index of the largest
element smaller than a given number in a sorted array.

> Currently, I'm using a Python class that does just that. But a C-level 
> implementation would be probably faster and more space-efficient.

I don't know how you do it in Python, but if you are doing the whole
search in Python, consider the following alternative:

  def max_index(a):
    max = maximum.reduce(a)
    index = compress(equal(a, max), arange(a.shape[0]))
    return max, index

This version is only for rank-1 arrays; a general version is possible,
but messy. It is still inefficient compared to C, but there is no
loop in Python, which probably makes it faster for long arrays.
And if the maximum occurs more than once, you even get all the
indices.

-------------------------------------------------------------------------------
Konrad Hinsen                     | E-Mail: hinsenk@ere.umontreal.ca
Departement de chimie             | Tel.: +1-514-343-6111 ext. 3953
Universite de Montreal            | Fax:  +1-514-343-7586
C.P. 6128, succ. Centre-Ville     | Deutsch/Esperanto/English/Nederlands/
Montreal (QC) H3C 3J7             | Francais (phase experimentale)
-------------------------------------------------------------------------------

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From hugunin@clark.lcs.mit.edu  Sun Mar 31 17:28:16 1996
From: hugunin@clark.lcs.mit.edu (James Hugunin)
Date: Sun, 31 Mar 96 12:28:16 -0500
Subject: [PYTHON MATRIX-SIG] max_element array method
Message-ID: <9603311728.AA13359@clark.lcs.mit.edu>


Try argmax and argmin.  (And since I had similar problems as  
Konrad, the next release will add argsort).

ie.

>>> argmax([1,2,3,4,3,2,1])
(4, 3)

This will only return the index of the first maxima in the list  
(which is usually what I want anyway).  This will work on  
arbitrarily high dimensional arrays, always acting along the last  
axis.

-Jim

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From fredrik_lundh@ivab.se  Sun Mar 31 19:33:19 1996
From: fredrik_lundh@ivab.se (Fredrik Lundh)
Date: Sun, 31 Mar 1996 21:33:19 +0200
Subject: [PYTHON MATRIX-SIG] Sorry to have to ask this question again...
In-Reply-To: <9603311728.AA13359@clark.lcs.mit.edu> (message from James
 Hugunin on Sun, 31 Mar 96 12:28:16 -0500)
Message-ID: <9603311933.AA06008@arnold.image.ivab.se>


but how do I get my hands at the most recent distribution?

cannot seem to get through to sls-ftp.lcs.mit.edu...

	/F

--------------------------------------------------------------------
PS! The first version of the Python Imaging Library is now released!
Join the image-sig for more info!

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================

From jjh@Goldilocks.LCS.MIT.EDU  Sun Mar 31 19:45:59 1996
From: jjh@Goldilocks.LCS.MIT.EDU (James Hugunin)
Date: Sun, 31 Mar 96 14:45:59 EST
Subject: [PYTHON MATRIX-SIG] Sorry to have to ask this question again...
Message-ID: <9603311945.AA05474@baribal.LCS.MIT.EDU.LCS.MIT.EDU>

Our group file server is down for some serious maintenence this weekend.  It should be
back up by Monday morning.

(Good news about the imaging lib, I'll have to give it a try.)

-Jim

=================
MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================