如何检查是numpy 2d array"包围"由零

时间:2017-10-25 19:03:32

标签: python arrays numpy

有没有任何简洁的方法来检查是由零包围的numpy数组。

示例:

[[0,0,0,0],
 [0,1,2,0],
 [0,0,0,0]]

我知道我可以通过迭代元素来查找,但我想知道我们可以在这里使用任何好的技巧。 numpy数组是浮点数,n x m是任意大小。

欢迎任何想法。

3 个答案:

答案 0 :(得分:4)

您可以使用numpy.any()来测试numpy数组中是否存在任何非零元素。

现在,为了测试2D数组是否被零包围,您可以获得第一列和最后一列以及第一行和最后一行,并测试其中是否包含非零数字。

def zero_surrounded(array):
    return not (array[0,:].any() or array[-1,:].any() or array[:,0].any() or array[:,-1].any())

答案 1 :(得分:3)

我们可以通过构建两个子矩阵来检查这个:

  • A[[0,-1]]第一行和最后一行,包括第一列和最后一列;和
  • A[1:-1,[0,-1]]第一列和最后一列,不包括第一行和最后一行。

这些矩阵的所有值都应该等于零,所以我们可以使用:

if np.all(A[[0,-1]] == 0) and np.all(A[1:-1,[0,-1]] == 0):
    # ...
    pass

这适用于任意2d数组,但不适用于任意深度的数组。然而,我们也可以使用这个技巧。

对于任意矩阵,我们可以使用:

def surrounded_zero_dim(a):
    n = a.ndim
    sel = ([0,-1],)
    sli = (slice(1,-1),)
    return all(np.all(a[sli*i+sel] == 0) for i in range(n))

严格来说,使用切片不是必需的,但它会阻止检查某些值两次。

答案 2 :(得分:2)

不是最快的,但可能是最短的(因而也是“整洁的”)方式:

surrounded = np.sum(a[1:-1, 1:-1]**2) == np.sum(a**2)
print(surrounded)  # True

此处,a是数组。

将所有平方元素的总和与除边界元素之外的所有平方元素之和进行比较。如果我们忽略了平方,正负边界值加起来为零的情况会产生错误的答案。