On Sat, May 8, 2010 at 9:29 PM, Eric Firing <efiring@hawaii.edu> wrote:
On 05/08/2010 04:16 PM, Ryan May wrote:
> On Sat, May 8, 2010 at 7:52 PM, Gökhan Sever<gokhansever@gmail.com>  wrote:
>> Hello,
>>
>> Consider my masked arrays:
>>
>> I[28]: type basic.data['Air_Temp']
>> ----->  type(basic.data['Air_Temp'])
>> O[28]: numpy.ma.core.MaskedArray
>>
>> I[29]: basic.data['Air_Temp']
>> O[29]:
>> masked_array(data = [-- -- -- ..., -- -- --],
>>               mask = [ True  True  True ...,  True  True  True],
>>         fill_value = 999999.9999)
>>
>>
>> I[17]: basic.data['Air_Temp'].data = np.ones(len(basic.data['Air_Temp']))*30
>> ---------------------------------------------------------------------------
>> AttributeError                            Traceback (most recent call last)
>>
>> ---->  1
>>        2
>>        3
>>        4
>>        5
>>
>> AttributeError: can't set attribute
>>
>> Why this assignment fails? I want to set each element in the original
>> basic.data['Air_Temp'].data to another value. (Because the main instrument
>> was forgotten to turn on for that day, and I am using a secondary
>> measurement data for Air Temperature for my another calculation. However it
>> fails. Although single assignment works:
>>
>> I[13]: basic.data['Air_Temp'].data[0] = 30
>>
>> Shouldn't this be working like the regular NumPy arrays do?
>
> Based on the traceback, I'd say it's because you're trying to replace
> the object pointed to by the .data attribute. Instead, try to just
> change the bits contained in .data:
>
> basic.data['Air_Temp'].data[:] = np.ones(len(basic.data['Air_Temp']))*30

Also, you since you are setting all elements to a single value, you
don't need to generate an array on the right-hand side.  And, you don't
need to manipulate ".data" directly--I think it is best to avoid doing
so.  Consider:

In [1]:x = np.ma.array([1,2,3], mask=[True, True, True], dtype=float)

In [2]:x
Out[2]:
masked_array(data = [-- -- --],
             mask = [ True  True  True],
       fill_value = 1e+20)


In [3]:x[:] = 30

In [4]:x
Out[4]:
masked_array(data = [30.0 30.0 30.0],
             mask = [False False False],
       fill_value = 1e+20)


In [5]:x[:] = np.ma.masked

In [6]:x
Out[6]:
masked_array(data = [-- -- --],
             mask = [ True  True  True],
       fill_value = 1e+20)


In [7]:x.data
Out[7]:array([ 30.,  30.,  30.])


Eric

>
> Ryan
>

_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Good to see this :)

I[45]: x = np.ma.array([1,2,3], mask=[True, True, True], dtype=float)

I[46]: x
O[46]:
masked_array(data = [-- -- --],
             mask = [ True  True  True],
       fill_value = 1e+20)


I[47]: x.data[:] = 25

I[48]: x
O[48]:
masked_array(data = [-- -- --],
             mask = [ True  True  True],
       fill_value = 1e+20)


I[49]: x[:] = 25

I[50]: x
O[50]:
masked_array(data = [25.0 25.0 25.0],
             mask = [False False False],
       fill_value = 1e+20)


I was also updating mask values after updating data attribute. Now setting the masked array itself to a number automatically flips the masks for me which is very useful. I check if a valid temperature exists, otherwise assign my calculation to another missing value.

--
Gökhan