【发布时间】:2018-06-14 17:20:53
【问题描述】:
我有以下二维数组
regions = array([[3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4],
[3, 3, 3, 3, 8, 8, 8, 8, 8, 4, 4, 4, 4],
[3, 3, 3, 3, 8, 8, 8, 8, 8, 4, 4, 4, 4],
[3, 3, 3, 3, 8, 8, 8, 8, 8, 4, 4, 4, 4],
[3, 6, 6, 6, 8, 8, 8, 8, 8, 7, 7, 7, 4],
[3, 6, 6, 6, 8, 8, 8, 8, 8, 7, 7, 7, 4],
[3, 6, 6, 6, 6, 8, 8, 8, 7, 7, 7, 7, 4],
[3, 6, 6, 6, 6, 2, 2, 2, 7, 7, 7, 7, 4],
[5, 6, 6, 6, 6, 2, 2, 2, 7, 7, 7, 7, 1],
[5, 6, 6, 6, 6, 2, 2, 2, 7, 7, 7, 7, 1],
[5, 6, 6, 6, 6, 2, 2, 2, 7, 7, 7, 7, 1],
[5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1],
[5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1]])
我想查找所有单个数字的相邻数字。例如3 是4,5,6,8 的邻居。目前我正在使用for loop 按照下面提到的代码进行此练习。
numbers = scipy.unique(regions)
for i in numbers:
index = i-1
slices = scipy.ndimage.find_objects(regions)
sub_im = regions[slices[index]]
im = sub_im == i
neighbors = scipy.ndimage.binary_dilation(input=im, structure=disk(1))
neighbors = neighbors*sub_im
neighbors_list = scipy.unique(neighbors)[1:] - 1
print (neighbors_list)
问题是我不想使用 for 循环,因为我的区域数组数量级为数百万。有没有不用for循环快速解决这个问题的方法?
【问题讨论】:
-
你可以迭代 2x2 窗口;如果窗口中有 3 保存窗口中所有不是 3 的数字。搜索 numpy 滑动/移动窗口以获得有效的 window 迭代器/生成器/步幅诡计。比较值得一试。
-
感谢您的回复@wwii。你有任何简单的链接来解释这种方法吗?
标签: python arrays performance scipy scikit-image