在 numpy 数组中选择没有"holes"的行,孔为 0(示例 ...,1,0,1,...)



如何在numpy数组中选择没有"孔"的行,孔为0。例如,如果我的输入是:

M = np.array([[0,10,0,20,30],[15,0,0,25,35],[0,40,40,40,0],[50,0,50,0,50]])

我希望输出为:

M = np.array([[15,0,0,25,35],[0,40,40,40,0]]) 

未选择第一行和最后一行,因为它们具有序列"非零整数"、"0,非零整数">

我认为convolution可以用来检测漏洞。

首先将非零转换为1,零转换为0。所以在像101这样的地方,convolution与窗口[1,1,1]的中心索引将是1*1 + 1*0 + 1*1= 2。因此,如果我们检查所有的零位置,如果卷积矩阵的值为2,我们可以检测空穴条件。

import numpy as np
M = np.array([[0,10,0,20,30],[15,0,0,25,35],[0,40,40,40,0],[50,0,50,0,50]])
M_ =  M.astype(bool).astype(int)
convolved = np.apply_along_axis(lambda x: np.convolve(x, [1,1,1], 'same'), 1, M_)
output = M[list(set(range(len(M_))).difference(np.where((convolved == 2) & (M_==0))[0]))]
print(output)
[[15  0  0 25 35]
[ 0 40 40 40  0]]

检测"漏洞";在一行中定义以下函数:

def hasHole(row):
wrk = np.vstack([np.roll(row, -1), (row == 0).astype(int), np.roll(row, 1)])[:, 1:-1]
return np.not_equal(wrk, 0).all(0).any()

然后,要查找有孔行的布尔索引,运行:

idx = np.apply_along_axis(hasHole, axis=1, arr=M)

最后,为了得到预期的结果,运行:

result = M[~idx]

结果是:

array([[15,  0,  0, 25, 35],
[ 0, 40, 40, 40,  0]])

最新更新