python 如果至少有2个大于一个值的邻居,如何屏蔽2D数组?

6l7fqoea  于 2022-12-10  发布在  Python
关注(0)|答案(1)|浏览(111)

对于2d numpy数组,例如,

import numpy as np
a = np.random.rand(5, 4)
a

a看起来像

array([[0.92576936, 0.41860519, 0.26446948, 0.31691141],
       [0.31797497, 0.2044637 , 0.20939504, 0.54034017],
       [0.85781227, 0.40367301, 0.40215265, 0.95902499],
       [0.15700837, 0.10680368, 0.61971475, 0.35586694],
       [0.25211967, 0.98171005, 0.60740472, 0.89452886]])

显然,每个元素都有邻居。对于边界中的元素,它有3个或5个邻居。对于中心元素,它有8个。因此,是否有一种高效而优雅的方法通过仅选择元素及其邻居合计大于0.5来屏蔽a?这意味着,不要考虑孤立大于0.5的元素,其邻居都小于0.5。
对于a,预期的输出掩码为

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

6tr1vspr1#

您可以使用2D卷积:

from scipy.signal import convolve2d

kernel = np.array([[1, 1,  1],
                   [1, 10, 1],
                   [1, 1,  1]])

out = convolve2d(a>0.5, kernel, mode='same') > 10

核函数的设计是,每个中心值〉0.5的核数为10,每个周围值〉0.5的核数为1,卷积计算总和。因此,如果总和〉10,就知道该值〉0.5,因此它至少有一个邻居。
输出量:

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

更经典的选择

from scipy.signal import convolve2d

m = a>0.5

kernel = np.array([[1, 1, 1],
                   [1, 0, 1],
                   [1, 1, 1]])

out = m & (convolve2d(m, kernel, mode='same') > 0)

相关问题