有一个看起来像这样的矩阵
9 9 1 9 9 9 9 1
9 9 1 9 9 9 9 9
9 9 9 9 9 9 9 9
9 9 1 9 9 9 9 9
9 9 9 9 9 1 1 1
9 9 9 9 9 1 9 9
9 9 9 1 9 9 9 9
9 9 1 9 1 9 9 9
我想检测矩阵中的每个位置,如果至少有一个1
值围绕有问题的矩阵,那么对于{2, 2}
中的元素,我想检查{{1}中的值1}}如果提到的任何位置包含1,那么我将{1,1}, {1,2}, {1,3}, {2,1}, {2,3}, {3,1}, {3,2}, {3,3}
中的元素存储在一个单独的变量中。
我不知道怎么弄这个,想知道是否有任何pythonic功能或方法可以做到这一点?
答案 0 :(得分:3)
您可以从this question获取灵感并使用conv2
在MATLAB中(您说“pythonic”但标记为MATLAB),如下所示:
numneighbours = conv2( A==1, [1 1 1; 1 0 1; 1 1 1], 'same' );
现在你想要numneighbours > 0
output = A(numneighbours > 0);
这当然可以在一行中完成。
This answer建议convolve2d
是Python的等效于MATLAB的conv2
。
答案 1 :(得分:1)
一个可能的解决方案是dilating一个掩码,它指示一个值的位置,方块为3x3 structuring element,如下所示:
onesMask = mat==1;
res = imdilate(mask,strel('square',3)) & ~onesMask;
结果:
0 1 0 1 0 0 1 0
0 1 0 1 0 0 1 1
0 1 1 1 0 0 0 0
0 1 0 1 1 1 1 1
0 1 1 1 1 0 0 0
0 0 1 1 1 0 1 1
0 1 1 0 1 1 1 0
0 1 0 1 0 1 0 0