[英]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.