Numeric arrays with named axes?

Duncan Smith buzzard at urubu.freeserve.co.uk
Thu Oct 17 19:22:55 EDT 2002


"Robbie Sedgewick" <bobsedge at yahoo.com> wrote in message
news:d375fcee.0210162255.4d515db1 at posting.google.com...
> I've been writing a lot of Numeric code lately that require arrays
> with many dimensions.  I think I currently have 5 dimensional array.
> It is starting to get somewhat confusing which axis is which
> especially with the different slices of the arrays floating arround.
>
> I'm thinking what is needed is some wrapper around Numeric arrays that
> allow me to refer to the axes of the array by name.  For example:
>
> >>> x = namedarray([[1, 2], [3, 4]], axis_names=["cow", "dog"])
> >>> x[{"cow":1}]
> namedarray([3, 4] axis_names=["dog"])
> >>> sum( x[{"cow"}:1] )
> 7
>
> Has anyone done anything like this?  I started to write a wrapper
> class, but it is somewhat complicated to figure out all the different
> ways that numeric functions change the shape of the array.
>
> Anyone got any better idea how to do this?
>
> Thanks,
> Robbie

Presumably there are a limited number of things you'd want to do with the
resulting object, so a class could be the answer.  I started to learn Python
by writing such a class (for various probability / contingency table related
stuff).  eg.

>>> from disc import *
>>> import Numeric
>>> cow = Variable(['friesan', 'charolet'], 'cow')
>>> dog = Variable(['whippet', 'terrier'], 'dog')
>>> values = Numeric.array([[0, 2], [3, 5]])
>>> t = NumTable(values, [cow, dog])
>>> t
array([[0, 2],
       [3, 5]]) ['cow', 'dog']
>>> t / cow                         #marginalisation
array([3, 7]) ['dog']
>>> t.condition(dog, 0)       #conditioning
array([0, 3]) ['cow']
>>> t.normalise()                 #normalisation
array([[ 0. ,  0.2],
       [ 0.3,  0.5]]) ['cow', 'dog']
>>> sheep = Variable(['tup', 'ewe'], 'sheep')
>>> t2 = NumTable(Numeric.array([6, 7]), [sheep])
>>> t2
array([6, 7]) ['sheep']
>>> t * t2                          #pointwise multiplication
array([[[ 0,  0],
        [12, 14]],
       [[18, 21],
        [30, 35]]]) ['cow', 'dog', 'sheep']
>>> t2 * t
array([[[ 0, 12],
        [18, 30]],
       [[ 0, 14],
        [21, 35]]]) ['sheep', 'cow', 'dog']  #i.e. the same table with a
different
>>> t3 = t2 * t
#ordering of the axes
>>> t3.variables[0].levels
['tup', 'ewe']
>>> t3.variables[0].name
'sheep'
>>> #etc.

I assume you'll be doing something different, so your code will be
different.  But it's certainly doable.

Duncan






More information about the Python-list mailing list