[Numpy-discussion] numpy.ma.compress

Pierre GM pgmdevlist at gmail.com
Thu Jan 24 04:58:04 EST 2008


On Thursday 24 January 2008 04:02:52 Stefan van der Walt wrote:
> I'm not 100% sure about the new behaviour -- compress now removes
> masked elements, instead of ignoring them.  Whereas a person would
> have been able to do
> compress(x,condition).compressed()
> before, the mask information is now thrown away.

Mmh, OK, I see. The problem arises when the condition is masked. Filling w/ 
False will get rid of the masked values, filling with True won't work either 
(cf example below). An option is then to simply take the condition as a 
ndarray.

>>>a=masked_array([1,2,3,4,5],mask=[0,0,1,1,0])
>>>a.compress(a<4)
masked_array(data = [1 2],
      mask = [False False],
      fill_value=999999)
>>>a.compress((a<4).filled(True))
masked_array(data = [1 2 -- --],
      mask = [False False  True  True],
      fill_value=999999)
>>>a.compress((a<4).view(ndarray))
masked_array(data = [1 2 --],
      mask = [False False  True],
      fill_value=999999)
>>>a[a<4]
masked_array(data = [1 2 --],
      mask = [False False  True],
      fill_value=999999)

> The numpy docstring states that compress should be equivalent to
> a[condition], which is no longer the case.
Good point... In most cases, as long as an axis is not specified. Note that 
the equivalence a.compress(condition) and a[condition] is not strictly true 
even for regular ndarrays: take a look at the example on the scipy site 
(http://www.scipy.org/Numpy_Example_List_With_Doc)

>>>b = array([[10,20,30],[40,50,60]])
>>>b.compress(b.ravel() >= 22)
array([30, 40, 50, 60])
>>>b[b.ravel()>=22]
IndexError: index (2) out of range (0<=index<=1) in dimension 0

Anyhow, I just commited an update fixing our initial problem (viz, forcing 
condition to a regular ndarray).



More information about the NumPy-Discussion mailing list