Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 二维numpy阵列:删除遮罩元素_Python_Arrays_Numpy - Fatal编程技术网

Python 二维numpy阵列:删除遮罩元素

Python 二维numpy阵列:删除遮罩元素,python,arrays,numpy,Python,Arrays,Numpy,假设我有一个这样的numpy屏蔽数组(其中-,是屏蔽数据): 我想创建一个新数组,在其中删除屏蔽数据,有效地返回如下数组: xlist = [[1000,1001,1002], [2000,2001,2002,2003]] 我试过这个: realXIndex = np.where(xlist.mask)[1] realX = np.delete(xlist,realXIndex, axis=1) 这将有效地从所有子阵列中移除遮罩值,因此2003也将被移除,而我希望保持它 如

假设我有一个这样的numpy屏蔽数组(其中-,是屏蔽数据):

我想创建一个新数组,在其中删除屏蔽数据,有效地返回如下数组:

xlist = [[1000,1001,1002],
         [2000,2001,2002,2003]]
我试过这个:

realXIndex = np.where(xlist.mask)[1]
realX = np.delete(xlist,realXIndex, axis=1)
这将有效地从所有子阵列中移除遮罩值,因此2003也将被移除,而我希望保持它


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

我的理解是,通常numpy数组需要沿各个轴保持维度,并且几乎所有的numpy操作都沿该轴的整个部分操作。又名,你不能真的删除一个元素,使其大小不均匀

虽然从技术上讲,可以使用混合长度数组,但大多数numpy函数都无法操作它们

至于您的直接问题,如果您想使用numpy在前面完成大量工作,然后在以后将其转换为特定的形式,您可以使用一个填充值,然后使用某种代码在以后正确地将其解析出来,从numpy数组转换为普通的python列表

差不多

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


从第一个
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])
我们可以在逐行的基础上应用compressed:

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数组、掩码数组和列表。我假设第一个
xlist
是屏蔽数组的部分显示。但是第二个是什么呢?由两个不同长度的列表组成的列表?掩码数组的
compressed
方法删除掩码元素,但返回1d数组
np.delete
删除整行或整列,而不是选定的元素。它无法返回不规则数组。嗨,这正是我遇到的问题,也是我发布此问题的原因。我没能拿回正确的东西。你的解决方案奏效了。在我发布我的问题几个小时后,我自己发现了类似的东西,但你的表述更容易理解。我做了一系列的列表,这很有魅力。最后一个建议效果最好。又快又干净:)
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)