如何获得'numpy.array'的边界?

时间:2018-01-04 14:12:04

标签: python numpy

如果我有dnp.array,我怎样才能得到边界的标记?

例如,在2d,

test = np.arange(16).reshape((4, 4))
test
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

现在我想获得边界

array([[ True,  True,   True,  True],
       [ True,  False,  False, True],
       [ True,  False,  False, True],
       [ True,  True,   True,  True]])

如果效率很高并适用于任意数量的维度,但它必须至少工作3.数组不一定是超立方体,但可能是超矩形:所有维度中的网格点数量不一定相同,与示例不同。

对于形状(4, 5, 6)的数组,预期输出为

array([[[ 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, False, False, False,  True],
        [ True, False, False, False, False,  True],
        [ True, False, False, False, False,  True],
        [ True,  True,  True,  True,  True,  True]],
       [[ True,  True,  True,  True,  True,  True],
        [ True, False, False, False, False,  True],
        [ True, False, False, False, False,  True],
        [ True, False, False, 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]]], dtype=bool)

1 个答案:

答案 0 :(得分:9)

你可以通过构建一个切片元组来实现这一点,例如

import numpy as np

def edge_mask(x):
    mask = np.ones(x.shape, dtype=bool)
    mask[x.ndim * (slice(1, -1),)] = False
    return mask

x = np.random.rand(4, 5)
edge_mask(x)

# array([[ True,  True,  True,  True,  True],
#        [ True, False, False, False,  True],
#        [ True, False, False, False,  True],
#        [ True,  True,  True,  True,  True]], dtype=bool)