mapping a function to a masked array

I have a masked array of values that I would like to transform through a user-defined function. Naturally, I want to ignore any values that are masked in the initial array. The user-defined function examines other points around the value in question, so I need to use ndenumerate (or similar) to get the array index as I iterate over the array. So, I have two questions: how to make this run without looping in Python, and how to avoid masked values. Here is the clunky solution I have so far: result = ma.copy (data) for i, val in ndenumerate (data): if not data.mask[i]: result[i] = myfunc (data, i, val) Any suggestions? Thanks, Ben

On Jan 12, 2011, at 12:45 PM, Ben Elliston wrote:
I have a masked array of values that I would like to transform through a user-defined function. Naturally, I want to ignore any values that are masked in the initial array.
The user-defined function examines other points around the value in question, so I need to use ndenumerate (or similar) to get the array index as I iterate over the array.
Can your function accept arrays as input ?
So, I have two questions: how to make this run without looping in Python, and how to avoid masked values. Here is the clunky solution I have so far:
result = ma.copy (data) for i, val in ndenumerate (data): if not data.mask[i]: result[i] = myfunc (data, i, val)
`result` doesn't have to be a masked array, right ? result = np.empty_like(data) ndata = data.data for (i, (v, m)) in enumerate(zip(ndata, data.mask)): if not m: result[i] = myfunc(ndata, i, v) The main point is to avoid looping on the masked array itself. Instead, you loop on the `data` and `mask` attributes , that are regular ndarrays only. Should be far more efficient that way. Same thing for myfunc: don't call it on the masked array, just on the data part. About looping: well, if you can vectorize your function, you may avoid the loop. You may also wanna try a list comprehension:
result = [myfunc(ndata,i,v) for (i,(v,m)) in enumerate(zip(ndata,data.mask)) if not m] and retransform result to a ndarray afterwards. Or use fromiterator ?
Let me know how it goes Cheers P.
participants (2)
-
Ben Elliston
-
Pierre GM