python - 使用 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.]])
我知道这不包括最后一个坐标,在我的例子中它没有给出“正确”的答案。然而,这确实为我的工作流程提供了正确的答案,因为我将数组分块在一起 - 所以最后一个丢失的坐标将是我下一个数组的第一个。无论如何,从中找出正确的答案应该不会太难。
推荐阅读
- geolocation - Maxmind GeoIP2 City Accuracy - “错误解析”是什么意思?
- java - 将 JSON 文件上传到 Firebase 存储(Android Java)
- sql - 有没有办法为所有数据库运行 sys.dm_db_log_space_usage ?
- terraform - 想要通过 terraform 将 aws ELB dns_name 与 api 网关端点集成
- laravel - 如何在 laravel 中关闭当前会话?
- sql - 组成员之间的拆分计数
- sql - 所需的分类帐查询
- android - 如何自定义 Retrofit 允许将 null 作为路径参数的值传递?
- android - ScrollView 无法与 ImageButtons 一起正常工作
- firebase - 从 Firebase 托管网站调用 Cloud Run 的最佳方式