주어진 숫자 (예 : 2)에 인접한 배열의 모든 고유 항목을 반환하는 것으로 알고 있습니다. NumPy 메서드로이 작업을 수행하는 한 가지 방법은 roll을 사용하여 주어진 영역을 위, 아래, 왼쪽 및 오른쪽으로 한 단위 씩 이동하는 것입니다. 이동 된 영역의 논리합이 취해지고이 조건과 일치하는 모든 별개의 요소가 반환됩니다. 그런 다음 자신의 이웃으로 간주되지 않으므로 영역 자체를 제거해야합니다.
roll
은 반대쪽 끝 (여기서는 바람직하지 않음)에서 배열의 경계를 넘어서는 값을 다시 도입하므로이 행이나 열을 False로 바꾸는 추가 단계가 있습니다.
n = x.max()
tmp = np.zeros((n+1, n+1), bool)
# check the vertical adjacency
a, b = x[:-1, :], x[1:, :]
tmp[a[a!=b], b[a!=b]] = True
# check the horizontal adjacency
a, b = x[:, :-1], x[:, 1:]
tmp[a[a!=b], b[a!=b]] = True
# register adjacency in both directions (up, down) and (left,right)
result = (tmp | tmp.T)
질문의 예 어레이 : 영역이 (0
에서 이상적 n
에) 작은 정수로 표지하는 경우
import numpy as np
x = np.array([[1, 1, 1], [1, 1, 2], [2, 2, 2], [3, 3, 3]], np.int32)
region = 2 # number of region whose neighbors we want
y = x == region # convert to Boolean
rolled = np.roll(y, 1, axis=0) # shift down
rolled[0, :] = False
z = np.logical_or(y, rolled)
rolled = np.roll(y, -1, axis=0) # shift up
rolled[-1, :] = False
z = np.logical_or(z, rolled)
rolled = np.roll(y, 1, axis=1) # shift right
rolled[:, 0] = False
z = np.logical_or(z, rolled)
rolled = np.roll(y, -1, axis=1) # shift left
rolled[:, -1] = False
z = np.logical_or(z, rolled)
neighbors = set(np.unique(np.extract(z, x))) - set([region])
print(neighbors)
지역별 의미를 설명해 주시겠습니까? 열을 의미합니까? –
이 경우 지역 정의에 대한 몇 가지 추가 설명을 추가했습니다. – cf2