Python 如何正确屏蔽numpy 2D阵列?

Python 如何正确屏蔽numpy 2D阵列?,python,numpy,matrix,mask,masked-array,Python,Numpy,Matrix,Mask,Masked Array,假设我有一个二维坐标数组,看起来像 x=array([[1,2],[2,3],[3,4]]) 在我之前的工作中,我制作了一个面具,最终看起来像 mask=[False,False,True] 当我尝试在2D坐标向量上使用此遮罩时,我得到一个错误 newX = np.ma.compressed(np.ma.masked_array(x,mask)) >>>numpy.ma.core.MaskError: Mask and data not compatible: data si

假设我有一个二维坐标数组,看起来像

x=array([[1,2],[2,3],[3,4]])

在我之前的工作中,我制作了一个面具,最终看起来像

mask=[False,False,True]

当我尝试在2D坐标向量上使用此遮罩时,我得到一个错误

newX = np.ma.compressed(np.ma.masked_array(x,mask))

>>>numpy.ma.core.MaskError: Mask and data not compatible: data size 
   is 6, mask size is 3.`
我想这是有道理的。因此,我尝试简单地使用以下遮罩:

mask2 = np.column_stack((mask,mask))
newX = np.ma.compressed(np.ma.masked_array(x,mask2))
而我得到的是接近:

>>数组([1,2,2,3])

达到我的期望(和愿望):

>>数组([[1,2],[2,3]])


一定有更简单的方法吗?

这就是你想要的吗

import numpy as np
x[~np.array(mask)]
# array([[1, 2],
#        [2, 3]])
或来自:


在上一个示例中,问题不在于遮罩。这是您对压缩的
的使用。从压缩的
文件字符串中:

Return all the non-masked data as a 1-D array.
因此
compressed
将非任务值展平为一维数组。(必须这样做,因为无法保证压缩数据将具有n维结构。)

在压缩遮罩数组之前,请先查看它:

In [8]: np.ma.masked_array(x, mask2)

Out[8]: 
masked_array(data =
 [[1 2]
 [2 3]
 [-- --]],
             mask =
 [[False False]
 [False False]
 [ True  True]],
       fill_value = 999999)

您的
x
是3x2:

In [379]: x
Out[379]: 
array([[1, 2],
       [2, 3],
       [3, 4]])
制作一个3元素布尔掩码:

In [380]: rowmask=np.array([False,False,True])
可用于选择为真或为假的行。在这两种情况下,结果都是2d:

In [381]: x[rowmask,:]
Out[381]: array([[3, 4]])

In [382]: x[~rowmask,:]
Out[382]: 
array([[1, 2],
       [2, 3]])
这不需要使用MaskedArray子类。为了制作这样的数组,我们需要一个形状与
x
匹配的掩码。没有规定仅屏蔽一个维度

In [393]: xmask=np.stack((rowmask,rowmask),-1)  # column stack

In [394]: xmask
Out[394]: 
array([[False, False],
       [False, False],
       [ True,  True]], dtype=bool)

In [395]: np.ma.MaskedArray(x,xmask)
Out[395]: 
masked_array(data =
 [[1 2]
 [2 3]
 [-- --]],
             mask =
 [[False False]
 [False False]
 [ True  True]],
       fill_value = 999999)
compressed
应用于生成展开数组的对象:
array([1,2,2,3])

由于掩蔽是逐元素进行的,它可能会掩蔽第1行中的一个元素,第2行中的2个元素等。因此通常
压缩
,移除掩蔽的元素,将不会生成2d数组。展平形式是唯一的一般选择

np.ma
在屏蔽值分散时最有意义。如果您想选择或取消选择整行或整列,那么它没有多大价值

===============

以下是更典型的屏蔽阵列:

In [403]: np.ma.masked_inside(x,2,3)
Out[403]: 
masked_array(data =
 [[1 --]
 [-- --]
 [-- 4]],
             mask =
 [[False  True]
 [ True  True]
 [ True False]],
       fill_value = 999999)

In [404]: np.ma.masked_equal(x,2)
Out[404]: 
masked_array(data =
 [[1 --]
 [-- 3]
 [3 4]],
             mask =
 [[False  True]
 [ True False]
 [False False]],
       fill_value = 2)

In [406]: np.ma.masked_outside(x,2,3)
Out[406]: 
masked_array(data =
 [[-- 2]
 [2 3]
 [3 --]],
             mask =
 [[ True False]
 [False False]
 [False  True]],
       fill_value = 999999)

由于这些解决方案对我都不起作用,我想写下解决方案的作用,也许它对其他人有用。我使用Python3.x,并且我使用了两个3D数组。一个,我称之为
data\u3d
包含大脑扫描记录的浮点值,另一个,
template\u3d
包含代表大脑区域的整数。我想根据
模板\u 3D
从与整数
区域\u code
对应的
数据\u 3D
中选择这些值:

my_mask = np.in1d(template_3D, region_code).reshape(template_3D.shape)
data_3D_masked = data_3D[my_mask]

这给了我一个只有相关录音的一维数组

使用
np.where
您可以做各种事情:

x_maskd = np.where(mask, x, 0)

啊,我明白了,所以我试着去做,我只是不能压缩它。有没有一种方法可以在不降低阵列维数的情况下移除阵列的屏蔽元素
np.ma.compressed()。只是想让它发挥作用。嗯,如果你想删除元素,我认为逻辑索引不是一个坏方法。你是对的,在我压缩它之前它是正确的。我将阅读文档,寻找一种在保留数组维度的同时删除屏蔽元素的方法。谢谢如果我理解你的意图,@Psidom的第一个建议看起来很合理。特别是,您可能不需要掩码数组。只需使用布尔数组为正则数组编制索引。
x_maskd = np.where(mask, x, 0)