我有一个numpy数组,如下所示:
x = np.array([[1,2,3],[4,5,6],[7,8,9]])
我需要创建一个函数,我们将其命名为“neighbors”,输入参数如下:
- x:numpy二维数组
- (i,j):二维数组中元素的索引
- d:邻域半径
作为输出,我想得到像元i,j
在给定距离d
下的邻居。
neighbors(im, i, j, d=1) with i = 1 and j = 1 (element value = 5)
我应该得到以下值的指数:[1,2,3,4,6,7,8,9]
.我希望我说得很清楚。有没有像scipy这样的库处理这个问题?
我已经做了一些工作,但这是一个粗略的解决方案。
def pixel_neighbours(self, p):
rows, cols = self.im.shape
i, j = p[0], p[1]
rmin = i - 1 if i - 1 >= 0 else 0
rmax = i + 1 if i + 1 < rows else i
cmin = j - 1 if j - 1 >= 0 else 0
cmax = j + 1 if j + 1 < cols else j
neighbours = []
for x in xrange(rmin, rmax + 1):
for y in xrange(cmin, cmax + 1):
neighbours.append([x, y])
neighbours.remove([p[0], p[1]])
return neighbours
我该如何改进这一点?
7条答案
按热度按时间bybem2ql1#
请查看
scipy.ndimage.generic_filter
.例如:
默认情况下,它将“反映”边界处的值。您可以使用
mode
关键字参数来控制这一点。然而,如果你想做这样的事情,你很有可能把你的问题表达成某种卷积,如果是这样,把它分解成卷积步骤并使用更优化的函数会快得多(例如,大多数
scipy.ndimage
)。wlp8pajw2#
EDIT:啊废话,我的答案只是写
im[i-d:i+d+1, j-d:j+d+1].flatten()
,但写在一个无法理解的方式:)古老的推拉窗技巧可能会在这里有所帮助:
这里没有做任何计时,但这个版本可能有合理的性能。
欲了解更多信息,请在网上搜索短语“滚动窗口numpy”或“滑动窗口numpy”。
xxls0lw83#
通过使用
max
和min
,可以处理上界和下界的像素:qni6mghb4#
我不知道有什么库函数可以实现这一点,但是您可以使用numpy强大的切片功能轻松地自己编写这样的代码:
当然,您应该执行一些范围检查,以避免越界访问。
ws51t4hk5#
我同意乔·金顿的回答,只是增加了脚印
或者用于例如更大/不同的覆盖区。
xmjla07d6#
是否可能在SciPy中使用KDTree?
nqwrtyyt7#
我们首先使用numpy初始化感兴趣的矩阵。
我们的邻居是距离的函数,例如,我们可能对距离为2的邻居感兴趣,这告诉我们应该如何填充矩阵x。我们选择用零填充,但您可以用任何您喜欢的填充,可能是行/列的平均值、众数、中值
我们用
x_padded
矩阵求出x
中任意值的邻居,设(i,j)
和(s,t)
分别是x
和x_padded
的索引,现在我们需要将(i,j)
转换为(s,t)
,以求出(i,j)
的邻居请注意!!!索引
(i,j)
指向您希望在矩阵x
中获取其相邻元素的任何值人们可能希望对矩阵
x
中的每个点进行迭代,获得其邻居,并使用邻居进行计算,例如在图像处理中,与核进行卷积。