【问题标题】:Finding indices where True values connect vertically and horizontally with numpy使用 numpy 查找 True 值垂直和水平连接的索引
【发布时间】:2020-05-04 23:26:21
【问题描述】:

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

在此示例中,我将合并任何可以通过差值小于 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]]

其中的值表示正方形的开始和结束。有什么好的方法吗?

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

【问题讨论】:

    标签: python numpy scipy boolean


    【解决方案1】:

    所以我使用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.]])
    

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

    【讨论】:

      猜你喜欢
      • 2014-04-19
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 2015-12-13
      • 2013-03-11
      • 1970-01-01
      相关资源
      最近更新 更多