首页 > 解决方案 > 使用 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]])

从左上角开始:

这将为您提供从 [0,2] 到 [2,2] 的第一个正方形。

此示例的所需输出将是:

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

其中值表示正方形的开始和结束。有没有这样做的好方法?

如果可能的话,我宁愿不要循环。

标签: pythonnumpyscipyboolean

解决方案


因此,我将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.]])

我知道这不包括最后一个坐标,在我的例子中它没有给出“正确”的答案。然而,这确实为我的工作流程提供了正确的答案,因为我将数组分块在一起 - 所以最后一个丢失的坐标将是我下一个数组的第一个。无论如何,从中找出正确的答案应该不会太难。


推荐阅读