[PYTHON MATRIX-SIG] Some thoughts on default axes.

tim@lassi.ece.uiuc.edu tim@lassi.ece.uiuc.edu
Wed, 21 Aug 1996 23:23:43 -0500

I have an idea about default axes. I'm not entirely satisfied with it,
but its been bugging me for a week or so, so I figured I'd let it bug
you'all instead.

To the best of my recollection, the arguments about default axes go
like this (apologies in advance for any misrepresentation of someone's

Jim Hugunin:
	Remembering what are the default axes is too comlicated. We
	should pick a single default axes and stick with it. (With
	perhaps 1 or 2 exceptions for some weird functions).

Konrad Hinsen:
	It's absurd to make people type axis=? for a whole class of
	functions that normally use an axis other than the
	default. The array functions divide naturally into two
	classes, those that normally use axis=0 and those that use the
	last possible axis (-1 for vector ops, -2 for 2d matrix ops,
	etc.). Therefore, it should be possible to figure out with a
	minimum of effort what the natural axis is.

I agree with both these posistions! It would be annoying to have to
type axis=0 (or conversely axis=-1) all over the place if there's a
single default axis. On the other hand, I'm not sure the difference
between structural and non-strucural matrix ops is clear for all
cases. Particularly for people new to NumPy. And, some people may have
different ideas about what is the natural axis for a particular
operation (Carlos said something about this, I think?).

A problem I see with both posistions, particuarly Jim's, is that there
will be a temptation to redefine the functions when the desired
default axis  with the default, e.g (as Jim posted),

def fft(f):
	fft(f, axis=-1)

Which leads to a problem with code readability for people who don't
use your conventions.

Some sort of naming convention could provide a way out of this
box. That is, indicate by the name of the function what the default
axis is, e.g.,

fft(f)  <=> fft(f,axis=0)
fft_(f) <=> fft(f,axis=-1)     # _ <=> farther away <=> -1 (or -2...)
A complete set of both functions could be provided, or just guidelines
on how people are to name their own should they need the other axis.

	1) No need to type axis=? for what should be the default case.
	2) Obvious at a glance what the default axis is.
	3) Removes incentive to create private versions of functions.

	1) Aesthetics?
	2) Requires a certain amount of function renaming.
	3) Doesn't help with dot (**).
	4) ....



(**) Another naming convention that is too ugly too live, but would
take care of dot, is:
dot00(f,g) = dot(f,g,axis=(0,0))
dot01(f,g) = dot(f,g,axis=(0,-1))
fft1(f) = fft(f,axis=-1)


| Tim Hochberg               Ultrahigh Speed Digital Electronics Lab |
| tim@lassi.ece.uiuc.edu              University of Illinois         |
| http://dogbert.ece.uiuc.edu/~tim         (217) 333-6014            |

MATRIX-SIG  - SIG on Matrix Math for Python

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