使用numpy查找True值垂直和水平连接的索引



我想合并某些数值接近的值。

在这个例子中,我将寻求合并任何可以通过差值小于2的相邻值连接的东西。

import numpy as np
a = np.arange(10)
a = np.delete(a, (3, 7))
matrix = np.abs(a.reshape(-1,1) - a)
matrix < 2
array([[ True,  True, False, False, False, False, False, False],
[ True,  True,  True, False, False, False, False, False],
[False,  True,  True, False, False, False, False, False],
[False, False, False,  True,  True, False, False, False],
[False, False, False,  True,  True,  True, False, False],
[False, False, False, False,  True,  True, False, False],
[False, False, False, False, False, False,  True,  True],
[False, False, False, False, False, False,  True,  True]])

从左上角开始:

  • 首先水平移动以查找最后一个真值
  • 然后向下查找最后一个真值
  • 重复这两个步骤,直到找到正方形
  • 无法对角连接True值

这将给出从[0,2]到[2,2]的第一个正方形。

这个例子的期望输出是:

[[0,2],[3,5],[6,7]]

其中的值表示正方形的起点和终点。有什么好方法可以做到这一点吗?

如果可能的话,我宁愿不绕圈。

所以我使用np.diagonal作为逻辑的基础来完成这项工作。

bm = matrix < 2
endcoords = np.argwhere(bm[1:].diagonal() == False)
zers = np.zeros(endcoords.shape)
zers[1:] += endcoords[:-1] + 1
end = np.hstack((zers, endcoords))
end
array([[0., 2.],
[3., 5.]])

我知道这排除了最后一个坐标,对于我的例子来说,这并不能给出"正确"的答案。然而,这确实为我的工作流程提供了正确的答案,因为我正在将数组分块在一起——所以最后一个缺失的坐标将是我下一个数组的第一个。无论如何,从中找出正确的答案应该不会太难。

最新更新