如何正确掩盖numpy 2D阵列?

Ano*_*ous 19 python numpy mask matrix 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 size 
   is 6, mask size is 3.`
Run Code Online (Sandbox Code Playgroud)

我认为这是有道理的.所以我试着简单地使用以下面具:

mask2 = np.column_stack((mask,mask))
newX = np.ma.compressed(np.ma.masked_array(x,mask2))
Run Code Online (Sandbox Code Playgroud)

我得到的是接近:

>>>array([1,2,2,3])

我期望(和想要):

>>>array([[1,2],[2,3]])

必须有一个更简单的方法来做到这一点?

Psi*_*dom 14

这是你想要的?

import numpy as np
x[~np.array(mask)]
# array([[1, 2],
#        [2, 3]])
Run Code Online (Sandbox Code Playgroud)

或者来自numpy蒙面数组:

newX = np.ma.array(x, mask = np.column_stack((mask, mask)))
newX

# masked_array(data =
#  [[1 2]
#  [2 3]
#  [-- --]],
#              mask =
#  [[False False]
#  [False False]
#  [ True  True]],
#        fill_value = 999999)
Run Code Online (Sandbox Code Playgroud)


Men*_*rel 14

有了np.where你,你可以做各种各样的事情:

x_maskd = np.where(mask, x, 0)
Run Code Online (Sandbox Code Playgroud)

np.where采用三个参数: a conditionxy。所有三个参数都必须能够广播为相同的形状。在mask为 True 的位置,x返回该值。否则,y返回该值。


hpa*_*ulj 5

x是3x2:

In [379]: x
Out[379]: 
array([[1, 2],
       [2, 3],
       [3, 4]])
Run Code Online (Sandbox Code Playgroud)

制作一个3元素的布尔掩码:

In [380]: rowmask=np.array([False,False,True])
Run Code Online (Sandbox Code Playgroud)

可以用来选择True或False的行。在这两种情况下,结果均为2d:

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

In [382]: x[~rowmask,:]
Out[382]: 
array([[1, 2],
       [2, 3]])
Run Code Online (Sandbox Code Playgroud)

这是不使用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)
Run Code Online (Sandbox Code Playgroud)

将其compressed应用于产生混乱的数组:array([1, 2, 2, 3])

由于遮罩是逐个元素地进行的,因此它可以对行1,行2中的一个元素进行遮蔽,等等。因此,一般而言compressing,删除被遮罩的元素将不会生成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)
Run Code Online (Sandbox Code Playgroud)