获取 numpy 矩阵中正方形的坐标

2024-01-02

给定以下 numpy 矩阵

import numpy as np
np_matrix = np.array([[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
                    ,[0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0]
                    ,[0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0]
                    ,[0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0]
                    ,[0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0]
                    ,[0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0]
                    ,[0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0]
                    ,[0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0]
                    ,[0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0]
                    ,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
                    ,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0]
                    ,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0,0,0]
                    ,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0]
                    ,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0]
                    ,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0]
                    ,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0]
                    ,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0]
                    ,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0]
                    ,[0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
                    ,[0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1]
                    ,[0,0,0,1,0,0,0,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0]
                    ,[0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0]
                    ,[0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0]
                    ,[0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0]
                    ,[0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0]
                    ,[0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0]
                    ,[1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0]
                    ,[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0]
                    ,[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0]
                    ,[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0]
                    ,[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0]
                    ,[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0]
                    ,[2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0]])

print(np_matrix)
print(np_matrix.shape)

可以表示为图像。

以下是关于输入矩阵的一些假设:

  • 矩阵形状可以变化。它不是固定的尺寸。
  • 方格的数量因矩阵而异。但矩阵中总是至少有一个方格。
  • 每个绿点周围都有一个正方形,正方形内部有一个点。正方形内的点标有数字 2
  • 正方形在 X 轴上是连续的,并且正方形的边界永远不会与其他正方形的边界重叠。正方形边框标有数字 1
  • 空白处标有数字 0

我有两个问题。如何以最有效的方式获得包含所有绿点坐标的数组?我怎样才能得到一个数组,其中绿点周围的正方形的所有角都包含在内?

这是我正在寻找的这个例子的结果:

green_dots_coordinates = [
    [0,0],  # dot 1 with coordinates x1, y1 inside square 1
    [7,12], # dot 2 with coordinates x2, y2 inside square 2
    [16,27],# dot 3 with coordinates x3, y3 inside square 3
    [29,21],# dot 4 with coordinates x4, y4 inside square 4
    [34,7], # dot 5 with coordinates x5, y5 inside square 5
]



sqaures_corners_coordinates = [
    #square nr 1
    [
        [0,6], # x1, y1
        [2,6], # x2, y2
        [0,0], # x3, y3
        [2,0], # x4, y4
    ],

    #square nr 2
    [
        [3,14], # x1, y1
        [9,14], # x2, y2
        [3,7], # x3, y3
        [9,7], # x4, y4
    ],

    #square nr 3
    [
        [12,31], # x1, y1
        [23,31], # x2, y2
        [12,24], # x3, y3
        [23,24], # x4, y4
    ],

    #square nr 4
    [
        [25,22], # x1, y1
        [32,22], # x2, y2
        [25,15], # x3, y3
        [32,15], # x4, y4
    ]

    ,#square nr 5
    [
        [33,13], # x1, y1
        [35,13], # x2, y2
        [33,0], # x3, y3
        [35,0], # x4, y4
    ],

]

坦率地说,您的输出格式非常奇怪,并且需要大量反转索引的顺序(并且使得输出对于索引原始数组来说相当无用),但这有效:

def find_boxes(np_matrix):
    np_mat = np_matrix[::-1, :]  # reversed in expected output
    def find_extent(arr, val):
        xn = arr.size
        x0 = np.flatnonzero(arr == 1)
        xi = np.searchsorted(x0, val, side = 'right')
        if xi == x0.size:
            x1 = x0[xi-1]
            x2 = xn - 1
        elif xi == 0:
            x1 = 0
            x2 = x0[xi]
        else:
            x1 = x0[xi-1]
            x2 = x0[xi]
        return np.array([x1, x2])

    green = np.where(np_mat == 2)
    green = tuple(g[np.argsort(green[-1])] for g in green)
    coords = np.empty((green[0].size, 2, 4))

    for i, (x, y) in enumerate(zip(*green)):
        coords[i, 0] =   np.tile(find_extent(np_mat[x, :], y),       2)
        coords[i, 1] = np.repeat(find_extent(np_mat[:, y], x)[::-1], 2)  # reversed again
    return np.stack(green)[::-1].T, coords.swapaxes(1,2).astype(int)
    # reversed again and transposed

Testing:

find_boxes(np_matrix)
Out: 
(array([[ 0,  0],
        [ 7, 12],
        [16, 27],
        [29, 21],
        [34,  7]], dtype=int32), 
 array([[[ 0,  6],
         [ 2,  6],
         [ 0,  0],
         [ 2,  0]],

        [[ 3, 14],
         [ 9, 14],
         [ 3,  7],
         [ 9,  7]],

        [[12, 31],
         [23, 31],
         [12, 24],
         [23, 24]],

        [[25, 22],
         [32, 22],
         [25, 15],
         [32, 15]],

        [[33, 13],
         [35, 13],
         [33,  0],
         [35,  0]]]))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取 numpy 矩阵中正方形的坐标 的相关文章

随机推荐

  • CSS vw 和 vh 但相对于父级而不是视口

    我正在尝试创建一个固定纵横比的框 调整大小以不溢出其父级 经典填充底部技巧 https stackoverflow com questions 1495407 maintain the aspect ratio of a div with
  • 显示字符串中不可打印的字符

    是否可以用十六进制值可视化 python 字符串中的不可打印字符 例如如果我有一个内部带有换行符的字符串 我想将其替换为 x0a 我知道有repr 这会给我 n 但我正在寻找十六进制版本 我不知道任何内置方法 但使用理解很容易做到 impo
  • 使用 AngularJS 将表单控件设置为焦点不变

    在我的表单中 我想在用户关注表单控件时将其设置为不受影响 以便隐藏在触摸字段且字段无效时显示的验证消息 我怎样才能做到这一点 我曾尝试编写指令但无法使其发挥作用 我可以在控制台中看到指令中的值从 true 更改为 false 但表单控件没有
  • 在 Xcode 6 beta 中使用尺寸类

    在 Xcode 6 Beta 1 中使用 Swift 从头开始 构建一个新项目 并查看 Storyboard 的文件检查器 有Use Size Classes below Use Auto Layout 这是这个的截图 1 什么是Use S
  • 某些 SMS 消息如何传输发件人姓名?

    我注意到我从公司收到的某些短信带有 发件人姓名 例如 就在今天 我收到了一条来自我以前从未使用过的号码 不是我的联系人 的短信 但发件人姓名显示为 Adobe 我也从其他公司得到这个 例如 Facebook Google 和银行 它与电子邮
  • 使用 jQuery Mobile 动态更改翻转切换的值

    我正在使用 jQuery Mobile 并将一些设置保存在 cookie 中 当设置页面重新加载时 我读取 cookie 以设置所有值 我在设置时遇到问题翻转拨动开关 http jquerymobile com demos 1 0a2 do
  • 使用GDB运行时致命错误消失

    我有一个程序 它在测试用例中产生致命错误 我可以通过读取致命错误的日志和堆栈跟踪来定位问题 原来是对空指针进行了读操作 但是当我尝试将 GDB 附加到它并在可疑代码周围设置断点时 无法观察到空指针 程序运行顺利 没有任何错误 这是一个单进程
  • HTML5 拖放上传

    有谁知道如何使用HTML5实现桌面拖放文件上传吗 我找到了以下参考资料 使用拖放选择文件 2017 08 https developer mozilla org en Using files from web applications Se
  • 为什么字符串的空间复杂度是 O(n) 而数字是 O(1)?

    我对辅助空间复杂性有点迷失 在我参加的讲座中 讲师指出字符串的空间复杂度为 O n 因为字符串的长度 n 会有所不同 但诸如数字 布尔值 未定义等原语具有恒定的空间复杂度 O 1 我很困惑 因为如果字符串的空间长度不同 那么数字也不一样吗
  • 如何管理开发和生产之间的 SQL 权限?

    我正在尝试建立一个顺利的部署过程 我们可以使用单个部署脚本部署到生产或开发 SQL 服务器 但我不知道如何最好地管理两个环境之间的用户和权限 例如 在开发中我们希望开发者团队拥有db owner数据库角色 在生产中 我们要么不希望访问 要么
  • Chrome 上的 D3 地图平移和缩放性能

    为了让事情变得更容易 这里有一个JSFiddle http jsfiddle net 3twag6Lx 我所拥有的 TRY 在 FireFox 版本 35 0 1 中平移地图 单击并按住地图上的任意位置 然后快速左右移动 平移运动应该快速且
  • 由于mac上的gcc不支持openmp,我该怎么做才能让它支持呢?

    起初 我在我的Mac上使用默认的gcc 但它不支持openmp 使用 gcc v 我得到 gcc 4 2 1 所以 我使用brew来安装gcc 完成后 使用 gcc v 没有任何变化 酿造给我提示 可能不支持openmp 使用 brew r
  • 如何创建带有预览的打印对话框以打印图像文件

    我有一个 mac cocoa 图像编辑应用程序 我想向我的应用程序添加打印图像功能 我基本上总是随身携带一个 jpg png 文件 每当用户进入 文件 gt 打印 菜单时 我想为用户提供一个带有打印选项 设置的对话框来打印此 jpg png
  • 删除电话号码中的括号、破折号和空格

    我的电话号码是 123 456 7890 我正在使用replaceAll去除方法 and 和字符串中的空格 我尝试以下 String phNo 123 456 7890 replaceAll s trim 但它不起作用 有什么解决办法吗 这
  • sed 在特定行号处内嵌替换特定列号值

    我有一个 5 列 csv 文件 空格分隔 如下所示 username1 20130310 enabled 20130310 enabled username2 20130310 enabled 20130321 disabled usern
  • Android浮动窗口隐藏状态栏辅助功能问题

    我正在开发 android 4 4 2 构建一个应用程序 该应用程序具有由辅助服务创建的系统覆盖 浮动窗口 Edit 我希望能够全局隐藏状态栏 在任何应用程序中 通过下面的代码实现 但是 当显示叠加层时 我停止从侦听器和软件 硬件后退按钮接
  • 有没有类似 Nokogiri 的东西可以解析 Ruby 代码?

    诺科切里太棒了 我可以做类似的事情 css bla 这将返回第一个匹配的元素 现在我们需要对 Ruby 源代码进行一些解析 查找类中的所有方法等 我们正在使用红宝石解析器 http parsetree rubyforge org ruby
  • D3js 制图:自动聚焦地理区域? (svg画布、缩放比例、坐标平移)

    我处理了 SRTM 栅格数据以生成 shapefiles gt geojson gt topojson 因此我可以为 D3js 提供合适的格式 The result look like this the blue area is my ov
  • 在基于范围的 for 循环中使用转发引用有什么优点?

    const auto 如果我想执行只读操作就足够了 然而 我却遇到了 for auto e v v is non const 最近几次 这让我想知道 与其他方法相比 在某些模糊的极端情况下 使用转发引用是否可能会带来一些性能优势 auto
  • 获取 numpy 矩阵中正方形的坐标

    给定以下 numpy 矩阵 import numpy as np np matrix np array 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0