[Numpy-discussion] scalar recordarrays
Francesc Altet
faltet at carabos.com
Mon Mar 19 05:00:14 EDT 2007
El ds 17 de 03 del 2007 a les 18:53 -0400, en/na Matthew Koichi Grimes
va escriure:
> I've found that if I have a record array of shape [] (i.e. a scalar
> recarray), I can't set its fields.
>
> >>> recarr
> recarray((0.0, 0.0, 0.0),
> dtype=[('x', '<f8'), ('dx', '<f8'), ('delta', '<f8')])
> >>> recarr.x[...] = 1.0
> TypeError: object does not support item assignment
>
> In the above, recarr.x returned a float "0.0", then attempted the
> assignment "0.0 = 1.0", which raised the TypeError. This is in contrast
> with the behavior of scalar ndarrays, where the above works as expected:
>
> >>> arr
> array(0.0)
> >>> arr[...] = 1.0
> >>> arr
> array(1.0)
You are having a couple of confusions here. The first is in terms of
nomenclature: in your examples, 'recarr' and 'arr' are *rank-0* ndarrays
and not scalar objects. Although both rank-0 and scalar objects do
contain the same information, they behave differently: a rank-0 array
behaves more similar to an array and the scalar more like a python
scalar.
The other confusion is that, while 'recarr' is a rank-0 array, recarr.x
is actually a true scalar, and you can assign to it in the regular
scalar way:
In [67]:recarr.x
Out[67]:1.0
In [68]:recarr.x = 2
In [69]:recarr.x
Out[69]:2.0
Having said this, I think there is a real inconsistency here that I
think it is worth to note. Let's see the next recarray behaviour:
In [70]:recarr2=numpy.rec.array([(1.0, 0, 3)], dtype)
In [71]:recarr2.x
Out[71]:array([ 1.])
In [72]:recarr2.x[...] = 0
In [73]:recarr2.x
Out[73]:array([ 0.])
i.e. 'recarr2' is a rank-1 array, and 'recarr2.x' is a rank-1 array (and
thus, assigning works as regular array assigns). In the same way, with a
rank-0 'recarr', 'recarr.x' should return a rank-0 array (for
consistency), but it doesn't:
In [74]:recarr=numpy.rec.array((1.0, 0, 3), dtype)
In [75]:recarr.x
Out[75]:1.0
In [76]:type(recarr.x)
Out[76]:<type 'numpy.float64'>
While I find this inconsistent, I'm not sure whether it should be be
fixed or not because the boundaries between rank-0 and scalar objects
are always a bit fuzzy. Travis can probably bring more light here.
Cheers,
--
Francesc Altet | Be careful about using the following code --
Carabos Coop. V. | I've only proven that it works,
www.carabos.com | I haven't tested it. -- Donald Knuth
More information about the NumPy-Discussion
mailing list