[SciPy-User] Populating a recarray from 0 size

Benjamin Root ben.root@ou....
Sun Aug 22 12:44:54 CDT 2010


On Sat, Aug 21, 2010 at 8:18 PM, Sergi Pons Freixes <spons@utm.csic.es>wrote:

> Hi everybody,
>
> I'm interested in populating a recarray a row at a time. I thought in
> using:
>
> -------
> # Creation of empty recarray
> names = ["cruise", "SEQ", "param", "r2", "stderr", "slope", "intercept"
> formats = ["i4", "i4", "S10", "f4", "f4", "f4", "f4"]
> statsc = scipy.empty(0, dtype={"names":names, "formats":formats})
>
> # Adding row and setting values
> statsc = scipy.resize(statsc, statsc.size + 1)
> statsc["cruise"][-1] = cr
> statsc["SEQ"][-1] = ca
> statsc["param"][-1] = yvar
> ...
> -------
>
> But scipy.resize complains with:
> statsc = scipy.resize(statsc, statsc.size + 1)
>  File "/usr/lib/python2.6/site-packages/numpy/core/fromnumeric.py",
> line 833, in resize
>    if not Na: return mu.zeros(new_shape, a.dtype.char)
> ValueError: Empty data-type
>
> So, is scipy not happy because statsc.size is 0 on the first resize?
> In this case, how could I overcome this limitation?
>
> Regards,
> Sergi
>
>
Sergi,

I had a similar need recently.  I was populating recarrays where I didn't
know the final size beforehand.  The way I solved the problem was to create
an iterator function and use .fromiter() to build the array.

A simplified example:

import numpy

class foobar(object) :
    def __init__(self) :
       self._myval = 0

    def __iter__(self) :
        return self

    def next(self) :
        if self._myval >= 7 :
            raise StopIteration

        self._myval += 1
        return self._myval

gen = foobar()
a = numpy.fromiter(gen, dtype=[('Column', 'i4')])
print a


However... for some reason, I can't seem to get this working.  Maybe someone
else can spot my error?

Ben Root
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.scipy.org/pipermail/scipy-user/attachments/20100822/98444ce0/attachment.html 


More information about the SciPy-User mailing list