[Numpy-discussion] at my wits end over an error message...

Zachary Pincus zachary.pincus@yale....
Sat Aug 30 22:10:10 CDT 2008

Hi Alan,

> Traceback (most recent call last):
>  File "/usr/local/lib/python2.5/site-packages/enthought.traits-2.0.4- 
> py2.5-linux-i686.egg/enthought/traits/trait_notifiers.py", line 325,  
> in call_1
>    self.handler( object )
>  File "TrimMapl_1.py", line 98, in _Run_fired
>    outdata = np.array(outdata, dtype=dtypes)
> TypeError: expected a readable buffer object

This would make it appear that the problem is not with numpy per se,  
but with the traits library, or how you're using it... I'm not too  
familiar with traits, so I can't really provide any advice there.

Can you disable whatever it is you're doing with traits for the time  
being, to see if that solves it? Maybe not have whatever notifier is  
presumably listening to outdata?

Also, for the record, your inner loop could be rendered in more  
idiomatic python as:

TYPICALLY_UINT_COLUMNS = set(['Track', 'Bin', 'code', 'horizon'])
        dtypes = []
        for var in self.var_list:
            if var in TYPICALLY_UINT_COLUMNS:
                dtypes.append(var, '<i8'))
            else :
                dtypes.append(var, '<f8'))
or even:

TYPICALLY_UINT_COLUMNS = set(['Track', 'Bin', 'code', 'horizon'])
dtypes = [(var, '<i8' if var in TYPICALLY_UINT_COLUMNS else '<f8') for  
var in self.var_list]

if you really want to break out the new ternary operator (py 2.5 and  

Not that it matters at all in this case, but (in addition to being  
easier to read and write) loops like the above will be much faster  
than the original code if you've got some larger parsing operations to  
do. (Also, note that the 'in' operator works on lists and tuples as  
well as sets and dicts, but for the former two, it's a linear search,  
while for the latter, a hash lookup.)


> TYPICALLY_UINT_COLUMNS = ['Track', 'Bin', 'code', 'horizon']
> ......
>        dtypes = [ ]
>        for i in range(0, len(self.var_list)) :
>            if TYPICALLY_UINT_COLUMNS.count(self.var_list[i]) > 0:
>                dtypes.append((self.var_list[i], '<i8'))
>            else :
>                dtypes.append((self.var_list[i], '<f8'))
>        print "dtypes = ", dtypes
>        print outdata[0]
>        outdata = np.array(outdata, dtype=dtypes)

More information about the Numpy-discussion mailing list