2016-07-05 56 views
6

说我有坐标的二维数组,看起来像如何正确掩盖numpy 2D数组?

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)) 

而我得到的是靠近:

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

到我所期待的(并希望):

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

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

回答

5

这是你在找什么?

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

或者从numpy masked array

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) 
+0

啊我看到了,所以我试着做的工作,我只是不能压缩它。嗯。有没有一种方法来删除数组中的蒙面元素而不失去数组的维度? 'np.ma.compressed()'做到了这两点。 – Anonymous

+0

我也没有太多关于蒙面的数组,可能与你的水平相同。只是想让它工作。那么,如果你试图删除元素,我认为逻辑索引不是一个坏方法。 – Psidom

1

在你的最后一个例子,这个问题是不是面具。这是您使用compressed。从compressed文档字符串:

Return all the non-masked data as a 1-D array. 

所以compressed展平了非屏蔽值到1-d阵列。 (它有,因为没有保证压缩数据将有一个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) 
+0

你说得对,在我压缩之前是正确的。我将阅读文档,以便在保留阵列维度的同时移除蒙版元素。谢谢 – Anonymous

+0

如果我明白你想要做什么,@ Psidom的第一个建议看起来很合理。特别是,你可能不需要一个蒙面数组。只需用布尔数组索引一个常规数组。 –

4

x是3x2的:

In [379]: x 
Out[379]: 
array([[1, 2], 
     [2, 3], 
     [3, 4]]) 

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

In [380]: rowmask=np.array([False,False,True]) 

这可以用来选择它为True的行,或者它是False的行。在两种情况下,结果都是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])

由于掩蔽是通过元素的元素,它可在第2行等中一般compressing掩模一个元件中的行1,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) 
0

由于这些解决方案的工作对我来说,我觉得写放下什么解决方案,也许它会对别人有用。我使用python 3.x,并在两个3D数组上工作。其中一个我称之为data_3D,它包含脑扫描中记录的浮点值,另一个包含代表大脑区域的整数。我想选择从data_3D对应的整数region_codetemplate_3D这些值:

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

这给了我唯一的相关记录的一维数组。

相关问题