[Numpy-discussion] ndarray __getattr__ to perform __getitem__

Robert Kern robert.kern at gmail.com
Thu Oct 28 17:29:32 EDT 2010


On Thu, Oct 28, 2010 at 15:17, Ian Stokes-Rees
<ijstokes at hkl.hms.harvard.edu> wrote:
> I have an ndarray with named dimensions.  I find myself writing some
> fairly laborious code with lots of square brackets and quotes.  It seems
> like it wouldn't be such a big deal to overload __getattribute__ so
> instead of doing:
>
> r = genfromtxt('results.dat',dtype=[('a','int'), ('b', 'f8'),
> ('c','int'), ('d', 'a20')])
> scatter(r[r['d'] == 'OK']['a'], r[r['d'] == 'OK']['b'])
>
> I could do:
>
> scatter(r[r.d == 'OK'].a, r[r.d == 'OK'].b)
>
> which is really a lot clearer.  Is something like this already possible
> somehow?

See recarray which uses __getattribute__.

> Is there some reason not to map __getattr__ to __getitem__?

Using __getattribute__ tends to slow down almost all operations on the
array substantially. Perhaps __getattr__ would work better, but all of
the methods and attributes would mask the fields. If you can find a
better solution that doesn't have such an impact on normal
performance, we'd be happy to hear it.

-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless
enigma that is made terrible by our own mad attempt to interpret it as
though it had an underlying truth."
  -- Umberto Eco



More information about the NumPy-Discussion mailing list