给定一个矩阵,我要计算与空(零)像元相邻的填充元素(非零像元)的数量,其中相邻元素沿着行(左/右)。
我已经尝试过np.roll
和减去矩阵,但我不确定如何编写没有循环的代码。
例如,给定矩阵:
arr =
[[1 1 0 0 0 0 0 0 1 0]
[1 1 0 0 0 0 0 1 1 1]
[0 1 1 0 0 0 0 0 0 0]
[0 1 1 0 0 0 0 0 0 0]
[0 1 1 0 0 0 0 0 0 0]
[0 0 1 0 0 0 0 0 0 0]
[0 0 1 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]]
我们有12个与零相邻的非零元素。
方法1
我们可以使用2D convolution
与适当的内核来解决它([1,1,1])
或([1,0,1])
在zeros
用于卷积求和掩模和外观是>=1
,该信号的至少一个零在三个元件的各滑动窗口和与所述当前元素的额外的检查,是非零确认至少有一个邻居0
。
实现看起来像这样-
In [245]: a # input array
Out[245]:
array([[1, 1, 0, 0, 0, 0, 0, 0, 1, 0],
[1, 1, 0, 0, 0, 0, 0, 1, 1, 1],
[0, 1, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
In [246]: from scipy.signal import convolve2d
In [248]: k = [[1,1,1]] # kernel for convolution
In [249]: ((convolve2d(a==0,k,'same')>=1) & (a!=0)).sum()
Out[249]: 12
方法#2
另一种方法是利用的slicing
,我们会寻找一次性沿每一行抵消元素的零和非零比赛为左侧和右侧LHS
和RHS
最后总结的-
maskRHS = (a[:,1:]==0) & (a[:,:-1]!=0)
maskLHS = (a[:,1:]!=0) & (a[:,:-1]==0)
maskRHS[:,1:] |= maskLHS[:,:-1]
out = maskRHS.sum() + maskLHS[:,-1].sum()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句