这个问题与这个问题非常相似,但我不知道如何将答案应用于2D或3D阵列。
对于一个简单的例子,使用以下形状的二维阵列(5,5(:
In [158]: a
Out[158]:
array([[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0]])
我想得到边的索引。对于这种情况:
(array([1, 1, 1, 2, 2, 3, 3, 3]), array([1, 2, 3, 1, 3, 1, 2, 3]))
现在,我在两个方向/轴上移动数组,与原始数组进行比较,并识别具有不同值的单元格:
In [230]: np.nonzero(a!= np.roll(a,shift=(1,1),axis=(0,1)))
Out[230]: (array([1, 1, 1, 2, 2, 3, 3, 4, 4, 4]), array([1, 2, 3, 1, 4, 1, 4, 2, 3, 4]))
有些指数是正确的,但有些则不然。我想,由于我应用的偏移,4s应该变成3s,但我不确定如何纠正这一点,因为我计划将其应用于更复杂(更大(的掩模阵列。我的最终目标是将其应用于3D阵列。
我使用的是Python 3.7.1
您可以将阵列与边缘检测滤波器进行卷积
import numpy as np
from scipy.ndimage import convolve
x = np.array(
[[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0]])
fil = [[-1,-1,-1],
[-1, 8,-1],
[-1,-1,-1]]
np.where(convolve(x,fil, mode='constant') > 1)
输出:
(array([1, 1, 1, 2, 2, 3, 3, 3]), array([1, 2, 3, 1, 3, 1, 2, 3]))
卷积的结果
convolve(x,fil, mode='constant')
输出:
[[-1 -2 -3 -2 -1]
[-2 5 3 5 -2]
[-3 3 0 3 -3]
[-2 5 3 5 -2]
[-1 -2 -3 -2 -1]]