I have multiple numpy masked arrays arr0, arr1, ..., arrn
.
I put them in a list arrs = [arr0, ..., arrn]
.
I want to flatten these arrays et put a mask on them. I did something like:
for arr in arrs:
arr = np.ravel(arr)
arr[mask] = ma.masked
I do not understand when Python make copies and when it is just a pointer. This for
loop does not flatten the arr0, ..., arrn
, (whereas ravel outputs a view and not a copy) it just flattens the variable arr
, although it does change their mask !
As I understand it, arr
is a view of the elements in the list arrs
, so when I change elements of arr
it changes the elements of the corresponding array in the list. But when I assign a new value to arr
it does not change the original array, even if the assignement is supposed to be a view of this array. Why ?
Edit with an example:
Arrays to flatten:
arr0 = masked_array(data=[[1,2],[3,4]], mask=False)
arr1 = masked_array(data=[[5,6],[7,8]], mask=False)
mask = [[False,True],[True,False]]
Expected output:
arr0 = masked_array(data=[[1,--],[--,4]], mask=[[False,True],[True,False]])
arr1 = masked_array(data=[[5,--],[--,8]], mask=[[False,True],[True,False]])
I'd like to do this in a loop because I have a lot of arrays (15 more or less), and I want to use the arrays name in the code. Is there no other way than do to:
arr0 = np.ravel(arr0)
...
arrn = np.ravel(arrn)