我可以向量化这个Python代码吗?

2024-02-29

我编写了这段 python 代码来获取标签的邻居(一组共享一些公共属性的像素)。标签的邻居被定义为位于边界另一侧的其他标签(相邻标签共享边界)。所以,我写的代码可以工作,但速度非常慢:

# segments: It is a 2-dimensional numpy array (an image really)
# where segments[x, y] = label_index. So each entry defines the
# label associated with a pixel.

# i: The label whose neighbours we want.

def get_boundaries(segments, i):
    neighbors = []
    for y in range(1, segments.shape[1]):
        for x in range(1, segments.shape[0]):
            # Check if current index has the label we want 
            if segments[x-1, y] == i:
                # Check if neighbour in the x direction has
                # a different label
                if segments[x-1, y] != segments[x, y]:
                    neighbors.append(segments[x,y])

            # Check if neighbour in the y direction has
            # a different label
            if segments[x, y-1] == i:
                if segments[x, y-1] != segments[x, y]:
                    neighbors.append(segments[x, y])

    return np.unique(np.asarray(neighbors))

你可以想象,我在这里可能完全误用了 python。我想知道是否有一种方法可以优化这段代码,使其更加Pythonic。


干得好:

def get_boundaries2(segments, i):
    x, y = np.where(segments == i) # where i is
    right = x + 1
    rightMask = right < segments.shape[0] # keep in bounds
    down = y + 1
    downMask = down < segments.shape[1]
    rightNeighbors = segments[right[rightMask], y[rightMask]]
    downNeighbors = segments[x[downMask], down[downMask]]
    neighbors = np.union1d(rightNeighbors, downNeighbors)
    return neighbors

正如您所看到的,根本没有 Python 循环;我还尝试最小化副本(第一次尝试制作了副本segments带有 NAN 边界,但后来我设计了“保持在边界内”检查)。

注意我没有过滤掉i本身就来自这里的“邻居”;如果你愿意的话,你可以很容易地在最后添加它。一些时间安排:

输入 2000x3000:原始需要 13 秒,我的需要 370 毫秒(35 倍加速)。

输入 1000x300:原始需要 643 毫秒,我的需要 17.5 毫秒(加速 36 倍)。

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

我可以向量化这个Python代码吗? 的相关文章

随机推荐

  • directX 创建交换链

    在我的书中 我编写了创建交换链的代码 IDXGIDevice dxgiDevice 0 mD3dDevice gt QueryInterface uuidof IDXGIDevice void dxgiDevice IDXGIAdapter
  • modelBuilder.IncludeMetadataInDatabase 在 EF CTP5 中的位置在哪里?

    使用 CTP4 我曾经能够执行以下操作 如由 ptrandem 建议 https stackoverflow com questions 3600672 entity framework ctp4 code first how to tur
  • Google Cloud Run 屏蔽授权标头中的承载令牌

    Cloud Run 的 Google 文档指出 您可以 从授权标头中提取令牌 文档在这里 https cloud google com run docs authenticating end users getting user profi
  • 字符串数组中的随机元素[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一个字符串数组 String f
  • Heroku 上的 .Net Core 和 Docker

    Context 我正在尝试部署一个ASPNET核心示例应用程序上Heroku https heroku com 与 docker 但不工作 repo https github com mykeels sample web api https
  • 无法通过在 Apache Beam 中创建模板来按所需顺序运行多个管道

    我有两个独立的管道 分别为 P1 和 P2 根据我的要求 我只需要在 P1 完全完成执行后才运行 P2 我需要通过一个模板完成整个操作 基本上 模板在找到 run 方式 即 p1 run 时就被创建 所以我可以看到 我需要使用两个不同的模板
  • 为什么信号处理程序中的 waitpid 需要循环?

    我在一本电子书中读到 waitpid 1 status WNOHANG 应该放在 while 循环下 这样如果多个子进程同时退出 它们都会被收获 我尝试了这个概念 同时创建和终止 2 个子进程 并通过 waitpid 不使用循环来获取它 并
  • 每个日期的 SQL 总金额

    我有一个名为 rentals 的表 其中存储如下数据 id rent id start date end date amount 1 54 12 10 2019 26 10 2019 100 2 54 13 10 2019 20 10 20
  • 检查一个列表是否是 pandas Dataframe 中另一个列表的子集

    所以 我有这个包含近 3000 行的 Dataframe 看起来像这样 CITIES 0 A B 1 A B C D 2 A B C 4 X 5 X Y Z 2670 Y Z 我想从 DF 中删除 CITIES 列表包含在另一行中的所有行
  • 如何在 phantomJS 中执行 jQuery Promise?

    我正在尝试在服务器端使用 nodejs 和 phantomjs 来对我们的网站进行 SEO 虽然 ajax 工作正常 但我无法执行我在代码中使用的自定义承诺 我如何让 phantomJS 等到承诺得到解决 下面是我编码的内容 body ad
  • 将 Android 项目档案导入 Eclipse 时出现问题

    如果这是一个愚蠢的新手问题 我很抱歉 我正在使用 Eclipse Helios 版本 并按照developer android com 的建议配置了 Android SDK 我可以毫无问题地创建和运行新项目 但无法使用 导入 gt 将现有项
  • opencv:将标量转换为浮点或双精度类型

    谁能帮我将 openCV 的标量类型转换为 float 或 double 等基本类型 Scalar Sum1 sum arg1 Sum2 sum arg2 theta at
  • 包装单张 - 地图未显示

    我对 Rstudio 中使用的 传单 包有一些疑问 我的问题是 底图没有显示 但在查看器的底部写着 OpenStreeMap 并且还显示了放大和缩小的选项 有人知道这个问题吗 library leaflet m lt leaflet m l
  • 自定义验证器不显示错误消息

    我有一个要求 需要多个字段之一 使用自定义验证器 偶数会触发 返回 false 但不会显示错误消息并且表单会验证 我缺少什么 我尝试过使用和不使用 ValidationSummary Thanks
  • 更新 JList

    我现在制作了一个基于数组列表的 JList 并由 defaultlistmodel 填充 该列表会在连接到服务器时添加人员 但不会显示连接的人员或之后连接的人员 所以 我必须更新 JList 我的问题是 我应该更新什么 是否可以使用运行更新
  • 带标签的维基数据 SPARQL 查询不起作用

    我不明白为什么通过这个查询我无法获得运动和流派标签 SELECT DISTINCT item itemLabel value inception creatorLabel image group concat genreLabel sepa
  • 如何动态导入 python 模块函数?

    假设my function 位于 my apps views 我想导入my function动态地不使用类似的东西exec or eval 有什么办法可以实现这一点吗 我想做类似的事情 my function import func my
  • 如何在msbuild文件中给出相对路径?

    我正在编写一个 msbuild 文件来使用 galio 运行测试 现在 我需要给出
  • 如何在汇编中通过字符串进行索引

    给定变量 var1 db abcdefg NULL 我将如何执行循环来导航每个字母 在 C 中 您可以在循环内执行类似 var x 的操作 然后每次递增 x 有任何想法吗 在 C 和 C 中 字符串以 NUL 结尾 这意味着将 ASCII
  • 我可以向量化这个Python代码吗?

    我编写了这段 python 代码来获取标签的邻居 一组共享一些公共属性的像素 标签的邻居被定义为位于边界另一侧的其他标签 相邻标签共享边界 所以 我写的代码可以工作 但速度非常慢 segments It is a 2 dimensional