如何删除numpy数组中的前导掩码元素?

汤姆

如何从numpy数组中删除前导掩码元素。例如下面的[2 x 5]的掩码数组:

m_arr = [[- - 1 - 1]
     [1 - - 1 1]]

删除领先的蒙版元素的输出将是

m_arr = [[1 - 1]
     [1 - - 1 1]]

我尝试在列表理解中使用压缩

[m.compressed.tolist() for m in m_arr]

但是甚至还没有解决办法np.apply_along_axis!

hpaulj

OK,制作被遮罩的数组:

In [96]: m_arr=np.ma.MaskedArray(np.arange(10).reshape(2,5),np.array([[1,1,0,1,0
    ...: ],[0,1,1,0,0]]))
In [97]: m_arr
Out[97]: 
masked_array(
  data=[[--, --, 2, --, 4],
        [5, --, --, 8, 9]],
  mask=[[ True,  True, False,  True, False],
        [False,  True,  True, False, False]],
  fill_value=999999)

迭代时查看1d数组属性:

In [99]: [(m.data,m.mask) for m in m_arr]
Out[99]: 
[(array([0, 1, 2, 3, 4]), array([ True,  True, False,  True, False])),
 (array([5, 6, 7, 8, 9]), array([False,  True,  True, False, False]))]

探索一个面具:

In [100]: m_arr[0].mask
Out[100]: array([ True,  True, False,  True, False])
In [101]: np.logical_and.accumulate(m_arr[0].mask)
Out[101]: array([ True,  True, False, False, False])
In [104]: m_arr[0][~_101]
Out[104]: 
masked_array(data=[2, --, 4],
             mask=[False,  True, False],
       fill_value=999999)

将其包装在函数中:

In [109]: def foo(m):
     ...:     mm = m.mask
     ...:     mm = ~np.logical_and.accumulate(mm)
     ...:     return m[mm]
     ...: 

并逐行应用:

In [110]: [foo(m) for m in m_arr]
Out[110]: 
[masked_array(data=[2, --, 4],
              mask=[False,  True, False],
        fill_value=999999),
 masked_array(data=[5, --, --, 8, 9],
              mask=[False,  True,  True, False, False],
        fill_value=999999)]

====

在后续问题中,您尝试将应用于logical_and整个数组(而不是逐行):

In [132]: np.logical_and.accumulate(m_arr.mask)
Out[132]: 
array([[ True,  True, False,  True, False],
       [False,  True, False, False, False]])

正确的申请-按行:

In [133]: np.logical_and.accumulate(m_arr.mask, axis=1)
Out[133]: 
array([[ True,  True, False, False, False],
       [False, False, False, False, False]])

使用布尔型掩码始终会使结果平坦。我们已经清楚地表明结果不能为2d-至少在每行真实值数量不同的一般情况下,结果不是2d。

In [134]: m_arr[~_]
Out[134]: 
masked_array(data=[2, --, 4, 5, --, --, 8, 9],
             mask=[False,  True, False, False,  True,  True, False, False],
       fill_value=999999)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章