2017-12-21 39 views
0

Nanでない値の2次元配列の周りにマスクを作成しようとしています。私の目標は、実際のデータの2か所にあるポイントをマスクすることです。簡単な例を以下に概説しますが、これは301,301のサイズを持つ2次元配列に適用されます。2次元配列内のデータポイントの外側エッジをマスクする

array = ([[nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,], 
      [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,], 
      [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,], 
      [nan, nan, 8, 5, nan, 3, nan, nan, nan, nan,], 
      [nan, nan, nan, 2, 1, nan, nan, nan, 9, nan,], 
      [nan, nan, 4, nan, nan, nan, nan, nan, nan, nan,], 
      [nan, nan, 8, nan, nan, nan, nan, nan, 3, nan,], 
      [nan, nan, 3, nan, nan, nan, nan, nan, nan, nan,], 
      [nan, nan, 2, nan, nan, nan, nan, nan, 6, nan,], 
      [nan, nan, 6, nan, nan, nan, nan, nan, 4, nan,], 
      [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,], 
      [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,], 
      [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,]]) 

mask = ([[False, False, False, False, False, False, False, False, False, False], 
     [ True, True, True, True, True, True, True, True, False, False], 
     [ True, True, True, True, True, True, True, True, True, True], 
     [ True, True, True, True, True, True, True, True, True, True], 
     [ True, True, True, True, True, True, True, True, True, True], 
     [ True, True, True, True, True, True, True, True, True, True], 
     [ True, True, True, True, True, True, True, True, True, True], 
     [ True, True, True, True, True, False, True, True, True, True], 
     [ True, True, True, True, True, False, True, True, True, True], 
     [ True, True, True, True, True, False, True, True, True, True], 
     [ True, True, True, True, True, False, True, True, True, True], 
     [ True, True, True, True, True, False, True, True, True, True], 
     [False, False, False, False, False, False, False, False, False, False]]) 

私は同様の例を見つけることができなかったので、助けや助言をいただければ幸いです。 arrを想定し

+0

これは 'numpy'配列かプレーンなPython' list'ですか? – schwobaseggl

答えて

0

は、自分の価値観を含むnumpyの配列です:

d = 2 # margin width around value cells to be set true in the mask 
# indices of not-nan array cells 
value_indices = np.argwhere(~np.isnan(arr)) 
# we initialize the mask with False 
mask = np.zeros_like(arr).astype(bool) 
# set the mask cells around indices with values (i.e. not nan) to True 
for i, j in value_indices: 
    mask[i-d:i+d+1, j-d:j+d+1] = True 
0

以下はあまりにもエレガントではないかもしれませんが、それは動作します。

from itertools import product 
from math import isnan 

def mask(array, row, col): 
    nan = float('nan') 
    return any(not isnan(array[r][c]) for r, c in product(
     range(max(0, row-2), min(len(array)-1, row+3)), 
     range(max(0, col-2), min(len(array[0])-1, col+3)))) 

>>> masked = [[mask(array, r, c) for c in range(len(array[r]))] for r in range(len(array))] 
[[False, False, False, False, False, False, False, False, False, False], 
[True, True, True, True, True, True, True, True, False, False], 
[True, True, True, True, True, True, True, True, True, True], 
[True, True, True, True, True, True, True, True, True, True], 
[True, True, True, True, True, True, True, True, True, True], 
[True, True, True, True, True, True, True, True, True, True], 
[True, True, True, True, True, True, True, True, True, True], 
[True, True, True, True, True, False, True, True, True, True], 
[True, True, True, True, True, False, True, True, True, True], 
[True, True, True, True, True, False, True, True, True, True], 
[True, True, True, True, True, False, True, True, True, True], 
[True, True, True, True, True, False, True, True, True, True], 
[False, False, False, False, False, False, False, False, False, False]]