假设我有一个像这样的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也被删除了,而我想要维护它。
如果有人能指出我正确的方向,那对我有很大的帮助。
答案 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]