[Numpy-discussion] field names on numpy arrays

Pierre GM pgmdevlist at gmail.com
Wed Jun 3 11:46:08 EDT 2009

On Jun 3, 2009, at 11:06 AM, D2Hitman wrote:

> Hi,
> I would like to have an object/class that acts like array of floats  
> such as:
> a_array = numpy.array([[0.,1.,2.,3.,4.],[1.,2.,3.,4.,5.]])
> but i would like to be able to slice this array by some header  
> dictionary:
> header_dict = {'a':0,'b':1,'c':2,'d':3,'e':4}
> such that i could use a_array['a'],
> which would get slice=header_dict['a'],
> slices a_array[:,slice]
> and return it.
> I understand record arrays such as:
> ...
> however i seem to lose simple operations such as multiplication  
> (a_array*2)
> or powers (a_array**2).

Indeed. Structured arrays don't support many operations (because  
they're fairly general. For example, one field could be a string, how  
do you define * for strings ?)

> Is there something that does this? Or how would i go about creating an
> object/class that inherits all properties from numpy.array, but adds  
> in a
> header to select columns?

Quick shot (not tested):
Subclass ndarray, define headdict as an attribute, overwrite  
__getitem__ w/ your own, where you test on the input:
* if the input item is a string then take the corresponding column  
from your headdict
* if the input item is anything else, use ndarray.__getitem__

Info on subclassing:

Note that you may want to put some fences here and there to prevent  
reshaping (else your headdict will become useless).

As a side-note, I think this subject has been talked about on this  
mailing list (or scipy's). Sorry, no particular, but you may want to  
check the archives.

More information about the NumPy-Discussion mailing list