如何在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]])