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

10

如果我有一个 d 维的 np.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)

每个维度中的网格点数不一定相同,那么它就 不是 NumPy 数组,对吗? - jdehesa
1
@jdehesa 现在清楚了吗?我的意思是 np.arange(20).reshape((4, 5)) 也是一个潜在的用例。 - FooBar
啊,抱歉我现在明白了,我以为你指的是某种不规则数组或其他什么东西。 - jdehesa
1个回答

13

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

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接