2014-06-18 59 views
1

我所試圖做的是使用masked_outside功能屏蔽掉的值,是不是在給定ndarray一個範圍,如numpy:如何在numpy ndarray的某些列上使用masked_outside?

import numpy as np 
import numpy.ma as ma 

a = np.zeros((3,3)) 
a[1,1] = -1 
a[2,1] = 1 
a[0,2] = 1 

b = ma.masked_outside(a, 0, 0) 

然後我得到:

a = array([[ 0., 0., 1.], 
      [ 0., -1., 0.], 
      [ 0., 1., 0.]]) 

b = masked_array(data = 
    [[0.0 0.0 --] 
    [0.0 -- 0.0] 
    [0.0 -- 0.0]], 
       mask = 
    [[False False True] 
    [False True False] 
    [False True False]], 
    fill_value = 1e+20) 

然而,我想排除某個列從掩蓋,如:

b = ma.masked_outside(a, 0, 0, exclude_cols=[2, ]) 

我該如何做到這一點?

什麼時候數組有一個非平凡的dtype,即具有命名字段的數組?

+0

你檢查了下面的答案嗎? –

回答

0

我不認爲有什麼內置的numpy,但它不應該太難以手動建立掩碼。有這樣的工作嗎?這個函數建立像masked_outside布爾矩陣確實和填充的排除的列與False

In [66]: def make_mask_outside(data, lower, upper, exclude_cols=None): 
    ...:  mask = (data < lower) | (data > upper) 
    ...:  if exclude_cols is not None: 
    ...:   for c in exclude_cols: 
    ...:    mask[:,c] = False 
    ...:  return mask 

In [67]: b = ma.masked_array(a, make_mask_outside(a, 0, 0, [2,])) 

In [68]: b 
Out[68]: 
masked_array(data = 
[[0.0 0.0 1.0] 
[0.0 -- 0.0] 
[0.0 -- 0.0]], 
      mask = 
[[False False False] 
[False True False] 
[False True False]], 
     fill_value = 1e+20) 
0

您可以使用多個條件的面具,在其中的一個,你考慮的列數(s)表示,要排除:

rows, cols = np.indices(a.shape) 
b = np.ma.array(a, mask=((a!=0) & (cols!=2))) 

#masked_array(data = 
# [[0.0 0.0 1.0] 
# [0.0 -- 0.0] 
# [0.0 -- 0.0]], 
#    mask = 
# [[False False False] 
# [False True False] 
# [False True False]], 
#  fill_value = 1e+20) 

這可以擴展到更多列,如:mask=((a!=0) & (cols!=2) & (cols!=3))等等。