繁体   English   中英

2D numpy数组:删除蒙版元素

[英]2D numpy array: remove masked elements

假设我有一个像这样的numpy掩码数组(其中-是掩码数据):

xlist = [[1000,1001,1002,--],
         [2000,2001,2002,2003]]

我想创建一个新数组,其中删除了被屏蔽的数据,有效地返回了这样的数组:

xlist = [[1000,1001,1002],
         [2000,2001,2002,2003]]

我已经试过了:

realXIndex = np.where(xlist.mask)[1]
realX = np.delete(xlist,realXIndex, axis=1)

这有效地从所有子数组中删除了被遮罩的值,因此在我要维护它的同时,也删除了2003。

如果有人可以指出正确的方向,那对我会有很大帮助。

从您的第一个xlist一个蒙版数组:

In [283]: xlist = [[1000,1001,1002,-9999],
     ...:          [2000,2001,2002,2003]]
     ...:          
In [284]: M = np.ma.masked_equal(xlist, -9999)
In [285]: M
Out[285]: 
masked_array(
  data=[[1000, 1001, 1002, --],
        [2000, 2001, 2002, 2003]],
  mask=[[False, False, False,  True],
        [False, False, False, False]],
  fill_value=-9999)

compressed将删除掩码的值,但返回一个1d数组。

In [286]: M.compressed()
Out[286]: array([1000, 1001, 1002, 2000, 2001, 2002, 2003])

我们可以逐行应用压缩:

In [287]: [m.compressed() for m in M]
Out[287]: [array([1000, 1001, 1002]), array([2000, 2001, 2002, 2003])]

或作为列表列表,甚至是列表的对象数组:

In [288]: [m.compressed().tolist() for m in M]
Out[288]: [[1000, 1001, 1002], [2000, 2001, 2002, 2003]]
In [289]: np.array(_)
Out[289]: 
array([list([1000, 1001, 1002]), list([2000, 2001, 2002, 2003])],
      dtype=object)

我的理解是,通常numpy数组要求沿所有各自的轴保持维数,并且几乎所有numpy运算都沿该轴的整个部分进行操作。 又名,您不能真正删除元素并使它的大小不均匀。

从技术上讲,您可以使用混合长度数组,但是大多数numpy函数都无法使用它们。

对于您的直接问题,如果您想使用numpy预先完成很多工作,然后在以后将其转换为特定的表单,则可以使用填充值,然后使用某种代码稍后从中正确解析出来一个普通的python列表中的numpy数组。

就像是

masked_array = np.where(mask, xlist, -99999)

然后

output = [[x for x in row where x != -99999] for row in masked_array]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM