2D numpy数组:删除屏蔽元素

时间:2018-05-24 19:12:12

标签: python arrays numpy

假设我有一个像这样的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也被删除了,而我想要维护它。

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

2 个答案:

答案 0 :(得分:1)

从第一个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)

答案 1 :(得分:-2)

我的理解是,通常numpy数组需要沿着所有相应的轴保持维度,并且几乎所有numpy操作都沿着该轴的整个部分运行。 AKA,你无法真正删除一个元素并使其大小不均匀。

虽然技术上可以使用混合长度数组,但它们不能通过大多数numpy函数操作。

至于你的直接问题,如果你想使用numpy来完成很多工作,然后将它转换成你的特定表单,你可以使用填充值,然后使用某种代码来正确地解析它之后,从一个numpy数组变成一个普通的python列表。

这样的东西
masked_array = np.where(mask, xlist, -99999)

然后

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