Hi all, I'm having an issue with np.ma.apply_along_axis not propagating a mask correctly. This code-snippet should hopefully show what's happening: -------------------- import numpy as np xy = np.random.random(size=(5,2)) mask = np.tile(np.array([True] * 3 + [False] * 2)[:,None], (1,2)) xyma = np.ma.array(xy, mask=mask) def myfunc(vec): x,y = vec return x,y xyma2 = np.ma.apply_along_axis(myfunc, 1, xyma) tst = "np.all(asarray(myfunc(xyma[1])).mask == xyma2[1].mask)" print tst, ":", eval(tst) -> np.all(asarray(myfunc(xyma[1])).mask == xyma2[1].mask) : False -------------------- The point here is not that xyma.mask != xyma2.mask, but that xyma2.mask != the output of myfunc run on the individual rows, which it seems like it should. The following simple change seems to fix this. --- /usr/lib/python2.6/dist-packages/numpy/ma/extras.py 2009-04-05 04:09:20.000000000 -0400 +++ tmp/extras.py 2010-01-27 10:45:10.000000000 -0500 @@ -322,7 +322,7 @@ n -= 1 i.put(indlist, ind) j.put(indlist, ind) - res = func1d(arr[tuple(i.tolist())], *args, **kwargs) + res = asarray(func1d(arr[tuple(i.tolist())], *args, **kwargs)) outarr[tuple(flatten_inplace(j.tolist()))] = res dtypes.append(asarray(res).dtype) k += 1 Does this seem like an improvement? I haven't explored performance issues yet, pending sanity check. Thanks, Angus. -- AJC McMorland Post-doctoral research fellow Neurobiology, University of Pittsburgh
participants (1)
-
Angus McMorland