我有以下单元格:
cells = np.array([[1, 1, 1],
[1, 1, 0],
[1, 0, 0],
[1, 0, 1],
[1, 0, 0],
[1, 1, 1]])
我希望计算水平和垂直相邻来得出这个结果:
# horizontal adjacency
array([[3, 2, 1],
[2, 1, 0],
[1, 0, 0],
[1, 0, 1],
[1, 0, 0],
[3, 2, 1]])
# vertical adjacency
array([[6, 2, 1],
[5, 1, 0],
[4, 0, 0],
[3, 0, 1],
[2, 0, 0],
[1, 1, 1]])
实际解决方案如下:
def get_horizontal_adjacency(cells):
adjacency_horizontal = np.zeros(cells.shape, dtype=int)
for y in range(cells.shape[0]):
span = 0
for x in reversed(range(cells.shape[1])):
if cells[y, x] > 0:
span += 1
else:
span = 0
adjacency_horizontal[y, x] = span
return adjacency_horizontal
def get_vertical_adjacency(cells):
adjacency_vertical = np.zeros(cells.shape, dtype=int)
for x in range(cells.shape[1]):
span = 0
for y in reversed(range(cells.shape[0])):
if cells[y, x] > 0:
span += 1
else:
span = 0
adjacency_vertical[y, x] = span
return adjacency_vertical
该算法基本上是(对于水平相邻):
- 遍历行
- 反向遍历列
- 如果单元格的x、y值不是零,则将1添加到实际跨度中
- 如果单元格的x、y值是零,则将实际跨度重置为零
- 将跨度设置为结果数组的新x、y值
由于我需要两次循环所有数组元素,所以对于更大的数组(例如图像),这很慢。
是否有一种使用矢量化或其他numpy技巧来改进算法的方法?
摘要:
joni和Mark Setchell提出了很好的建议!
我创建了一个小型Repo,其中包含一个示例图像和一个带有比较的python文件。结果令人惊讶:
- 原始方法:3.675秒
- 使用Numba:0.002秒
- 使用Cython:0.005秒