[Numpy-discussion] retrieving type objects for void array-scalar objects

Francesc Altet faltet at carabos.com
Sun Feb 5 04:33:04 CST 2006

El dv 03 de 02 del 2006 a les 22:05 +0100, en/na N. Volbers va escriure:
> Is there some way to retrieve the type object directly from the array (not using any existing row) using only the name of the item?  I have checked the dtype attribute, but I could only get the character representation for the item types (e.g. 'f4').

Ops, I've just discovered a new way to get the type in a simpler way:

In [17]:dtype = numpy.dtype({'names': ['name', 'weight'],'formats':
['U30', 'f4']})

In [18]:a = numpy.array([(u'Bill', 71.2), (u'Fred', 94.3)], dtype=dtype)

In [20]:a.dtype.fields['name'][0].type
Out[20]:<type 'unicodescalar'>

In [21]:a.dtype.fields['weight'][0].type
Out[21]:<type 'float32scalar'>

For nested types, something like this should work:

ntype = a.dtype.fields['name'][0].fields['nested_field'][0].type

By the way, you will need numpy 0.9.5 (at least) for this to work.

Incidentally, Travis, what do you think about allowing:

In [30]:a.dtype.fields['weight']

instead of current:

In [30]:a.dtype.fields['weight']
Out[30]:(dtype('<f4'), 120)

That way, users can access more easily to nested types:

ntype = a.dtype.fields['name'].fields['nested_field'].type

However, you will loose the info about the byteoffset/stride.

Alternatively, perhaps it would be interesting to give the dtype an
__getitem__ method so that we can do:

ntype = a.dtype['name']['nested_field'].type

In case of a dtype with no fields (i.e. a plain array), the
dtype[something] would raise a 'KeyError'. This approach would let the
current dtype.fields method untouched. I can work in a patch for this,
if you find it useful.


>0,0<   Francesc Altet     http://www.carabos.com/
V   V   Cárabos Coop. V.   Enjoy Data

More information about the Numpy-discussion mailing list