据我所知,任务是返回数组中与给定数字(例如 2)相邻的所有不同条目。使用 NumPy 方法实现此目的的一种方法是使用roll http://docs.scipy.org/doc/numpy/reference/generated/numpy.roll.html#numpy.roll将给定区域向上、向下、向左、向右移动一个单位。对移位区域进行逻辑或,并返回与此条件匹配的所有不同元素。然后仍然需要删除该区域本身,因为它不被视为自己的邻居。
Since roll
重新引入超出数组两端边界的值(这里不需要),额外的步骤是用 False 替换该行或列。
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)