2016-07-05 98 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] 

這給了我唯一的相關記錄的一維數組。

相關問題