屏蔽二维数组中数据点的外边缘
Mask outer edges of data points in a 2d array
我正在尝试围绕非 Nan 值的二维数组创建掩码。我的目标是屏蔽实际数据 2 个位置以内的点。下面概述了一个简单示例,但这将应用于大小为 301,301 的二维数组。
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
是一个包含您的值的 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
以下可能不太优雅,但它会起作用。它假定所有行都具有相同的长度:
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]]
我正在尝试围绕非 Nan 值的二维数组创建掩码。我的目标是屏蔽实际数据 2 个位置以内的点。下面概述了一个简单示例,但这将应用于大小为 301,301 的二维数组。
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
是一个包含您的值的 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
以下可能不太优雅,但它会起作用。它假定所有行都具有相同的长度:
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]]