I really like the structure variable in IDL. Especially the arrays of structure. It allows to search for elements using the where function and to extract a sub-structure matching a give condition.
I mean, if I have an dataset like this:
IDL> a = replicate({name:'',ra:0.0,dec:0.0},1000)
I can search for all the elements matching for exemple:
IDL> tt = where(a.ra gt 10. and abs(a.dec) gt 5.)
IDL> b = a[tt]
The same (more or less) can be made using numpy (imported as np):
a = np.zeros((1000,),dtype=[('name', str), ('ra', float), ('dec', float)])
tt = ((a['ra'] > 5.) & (abs(a['dec']) < 10.))
b = a[tt]
I don't really know if this is the best way. And also don't know how to access for example the second tag without naming it, like in IDL a.(1)...
I can also create an object:
class obs(object):
def __init__(self,name='',ra=0.,dec=0.):
self.name=name
self.ra=ra
self.dec=decAnd even define an array of objects:
colec = np.empty( (3,3), dtype=object)
And then put the objects in the colec:
colec[:,:] = obs()
BUT this will create a collection of 9 times the same object!!!
colec[0,0].ra = 5.5
colec[1,1].ra
>>>5.5
Some loop needed here. But the worst is that one will loose all the power of linear algebra from numpy.
So stay with the first approach for now.
Your approach will work okay for many uses, but a better approach to my mind is to something like:
RépondreSupprimera = np.recarray((1000,),dtype=...)
then slices of a will also have a record type and you can fill a by statements like:
a.ra = ra
a1 = a[2]
print a1.name