[Numpy-discussion] problem with assigning to recarrays

Brian Gerke bgerke@slac.stanford....
Fri Feb 27 18:26:27 CST 2009


I'm quite new to numpy and to python in general, so I apologize if I'm  
missing something obvious, but I've come across some seemingly nasty  
behavior when trying to assign values to the fields of an indexed  
subarray of a numpy record array.   Perhaps an example would explain  
it best.

First, I make a boring record array:

	In [124]: r = rec.fromarrays([zeros(5), zeros(5)],  

This has five elements with two fields, all values are zero.
Now I can change the values for field1 for a few of the array elements:

	In [125]: r[1].field1=1

	In [126]: r[3].field1=1

Let's check and make sure that worked:

	In [127]: print r.field1
	[ 0. 1. 0. 1. 0.]

So far, so good.
Now I want to change the value of field2 for those same elements:

	In [128]: r[where(r.field1 == 1.)].field2 = 1

Ok, so now the values of field 2 have been changed, for those elements  

	In [129]: r.field2

	Out[129]: array([ 0.,  0.,  0.,  0.,  0.])

Wait.  What?
That can't be right.  Let's check again:

	In [130]: print r[where(r.field1 == 1.)].field2
	[ 0. 0.]

Ok, so it appears that I can *access* fields in this array with an  
array of indices, but I can't assign new values to fields so  
accessed.  However, I *can* change the values if I use a scalar  
index.  This is different from the behavior of ordinary arrays, for  
which I can reassign elements' values either way.

Moreover, when I try to reassign record array fields by indexing with  
an array of indices, it would appear that nothing at all happens.    
This syntax is equivalent to the pass command.

So, my question is this:  is there some reason for this behavior in  
record arrays, which is unexpectedly different from the behavior of  
normal arrays, and rather confusing.   If so, why does the attempt to  
assign values to fields of an indexed subarray not raise some kind of  
error, rather than doing nothing?  I think it's unlikely that I've  
actually found a bug in numpy, but this behavior does not make sense  
to me.

Thanks for any insights,


More information about the Numpy-discussion mailing list