如何在类似于 Matlab blockproc (blockproc) 函数的块中有效地处理 numpy 数组

2023-12-05

我正在寻找一种好方法,可以有效地将图像划分为小区域,单独处理每个区域,然后将每个处理的结果重新组装成单个处理后的图像。 Matlab 有一个工具可以解决这个问题,叫做blkproc(取而代之blockproc在较新版本的 Matlab 中)。

在理想的情况下,函数或类也将支持输入矩阵中的划分之间的重叠。在Matlab帮助中,blkproc定义为:

B = blkproc(A,[m n],[mborder nborder],乐趣,...)

  • A 是你的输入矩阵,
  • [m n] 是块大小
  • [border, border] 是边框区域的大小(可选)
  • fun 是应用于每个块的函数

我已经拼凑出一种方法,但我觉得它很笨拙,我敢打赌还有更好的方法。冒着让我自己尴尬的风险,这是我的代码:


import numpy as np

def segmented_process(M, blk_size=(16,16), overlap=(0,0), fun=None):
    rows = []
    for i in range(0, M.shape[0], blk_size[0]):
        cols = []
        for j in range(0, M.shape[1], blk_size[1]):
            cols.append(fun(M[i:i+blk_size[0], j:j+blk_size[1]]))
        rows.append(np.concatenate(cols, axis=1))
    return np.concatenate(rows, axis=0)

R = np.random.rand(128,128)
passthrough = lambda(x):x
Rprime = segmented_process(R, blk_size=(16,16), 
                           overlap=(0,0), 
                           fun=passthrough)

np.all(R==Rprime)

以下是使用块的不同(无循环)方式的一些示例:

import numpy as np
from numpy.lib.stride_tricks import as_strided as ast

A= np.arange(36).reshape(6, 6)
print A
#[[ 0  1  2  3  4  5]
# [ 6  7  8  9 10 11]
# ...
# [30 31 32 33 34 35]]

# 2x2 block view
B= ast(A, shape= (3, 3, 2, 2), strides= (48, 8, 24, 4))
print B[1, 1]
#[[14 15]
# [20 21]]

# for preserving original shape
B[:, :]= np.dot(B[:, :], np.array([[0, 1], [1, 0]]))
print A
#[[ 1  0  3  2  5  4]
# [ 7  6  9  8 11 10]
# ...
# [31 30 33 32 35 34]]
print B[1, 1]
#[[15 14]
# [21 20]]

# for reducing shape, processing in 3D is enough
C= B.reshape(3, 3, -1)
print C.sum(-1)
#[[ 14  22  30]
# [ 62  70  78]
# [110 118 126]]

所以只是想简单地复制matlab功能numpy并不是所有方法都是最好的方法。有时需要“即兴”思考。

Caveat:
一般来说,基于跨步技巧的实现may(但不一定需要)遭受一些性能损失。因此,请准备好以各种方式衡量您的表现。在任何情况下,明智的做法是首先检查所需的功能(或足够相似的功能,以便轻松适应)是否已全部准备好实现numpy or scipy.

Update:
请注意,没有真正的magic在这里涉及到strides,所以我将提供一个简单的函数来获取block_view任何合适的 2Dnumpy-大批。那么我们开始吧:

from numpy.lib.stride_tricks import as_strided as ast

def block_view(A, block= (3, 3)):
    """Provide a 2D block view to 2D array. No error checking made.
    Therefore meaningful (as implemented) only for blocks strictly
    compatible with the shape of A."""
    # simple shape and strides computations may seem at first strange
    # unless one is able to recognize the 'tuple additions' involved ;-)
    shape= (A.shape[0]/ block[0], A.shape[1]/ block[1])+ block
    strides= (block[0]* A.strides[0], block[1]* A.strides[1])+ A.strides
    return ast(A, shape= shape, strides= strides)

if __name__ == '__main__':
    from numpy import arange
    A= arange(144).reshape(12, 12)
    print block_view(A)[0, 0]
    #[[ 0  1  2]
    # [12 13 14]
    # [24 25 26]]
    print block_view(A, (2, 6))[0, 0]
    #[[ 0  1  2  3  4  5]
    # [12 13 14 15 16 17]]
    print block_view(A, (3, 12))[0, 0]
    #[[ 0  1  2  3  4  5  6  7  8  9 10 11]
    # [12 13 14 15 16 17 18 19 20 21 22 23]
    # [24 25 26 27 28 29 30 31 32 33 34 35]]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在类似于 Matlab blockproc (blockproc) 函数的块中有效地处理 numpy 数组 的相关文章

随机推荐

  • 我的应用程序从“平板电脑”Google Play 中消失,但仍可用于手机

    我的应用程序在 Google Play 上发布了几个月 拥有手机和平板电脑的人都可以下载它 令人惊讶的是 有时在过去两周内 Google Play 的某些内容发生了变化 我的应用程序仅适用于手机 当我使用平板电脑搜索时找不到它 知道是否有什
  • 使用 C# 强制关闭 Windows CE 5 应用程序

    如何使用 C 在 Windows CE 5 0 上强制关闭应用程序 我已经尝试过了Application Exit 但这并不总是杀死所有当前正在运行的线程 我通常会使用Environment Exit 但不幸的是 这在 CF 中不可用 这取
  • VBa 条件删除循环不起作用

    我正在电子表格上运行以下代码 Do While i lt 100000 If Not Cells i 4 String Then Cells i 4 EntireRow Delete End If i i 1 Loop 有很多条目not 字
  • 如何查看客户购买产品的次数

    在 woocommerce 中 如何检查客户在所有订单中购买产品的次数 我如何检查客户在他下的所有订单中可以购买某种产品的次数 当前客户的产品购买历史记录示例 Product one bought 5 times Product five
  • 如何从两个表中查找不相等的值

    我正在进行左连接查询 以比较两个表中 f9 和 sumoff6 列上彼此不相等的任何值 仅当 F1 列相同时 如果它们不同 我想减去它们 我得到的结果显示两个表上已有相同的值 我需要 f1 列在两个表上匹配 但如果它们在 sumoff6 和
  • sizeof(long) == sizeof(void*) 吗?

    C是否保证sizeof long sizeof void 如果不是 为什么它在 Linux 内核源代码中如此广泛地使用 我在看sizeof int sizeof void 但这谈论的是sizeof int vs sizeof void 不
  • 如何将gridview模板化的Item数据保存到DB中并生成word文档?

    我有几个位于 gridview 之外的文本框和一个模板化项目 gridview 单击位于 gridview 之外的按钮 我想将数据保存到数据库表中并生成word文档 在word文档中 数据将显示类似这样的内容 采购订单号 123 公司名称
  • 将 R 中向量的所有元素相乘

    我想要一个函数返回向量中所有值的乘积 例如sum但用乘法而不是加法 我预计它已经存在 但如果存在 我找不到它 这是我的解决方案 product lt function vec out lt 1 for i in 1 length vec o
  • 切换主显示器的简单应用程序

    我目前的电脑设置是在办公桌上放置一台 17 英寸显示器 在几英尺外放置高清电视 每隔一段时间 通常是玩游戏时 当我将主显示器切换到高清电视时 效果会更好 我运行的是 Vista 所以事情可能会变得非常痛苦 因为我必须通过几个窗口才能切换 我
  • Json和循环引用异常

    我有一个对象 它对另一个对象有循环引用 考虑到这些对象之间的关系 这是正确的设计 为了显示 Machine gt Customer gt Machine 正如预期的那样 当我尝试使用 Json 序列化机器或客户对象时 我遇到了问题 我不确定
  • 如何处理 raw_input 中的整数和字符串?

    仍在尝试理解Python 它与 php 有很大不同 我将选项设置为整数 问题出在我的菜单上 我也需要使用字母 如何一起使用整数和字符串 为什么我不能设置为字符串而不是整数 def main Display the main menu whi
  • AutoMapper 一对多关系

    我开始在我的项目中使用 AutoMapper 为此 我想做以下 一对多 映射 Source public class Team int Id get set string TeamName get set List
  • 在 C++ 中使用数组或 std::vectors,性能差距是什么?

    在我们的 C 课程中 他们建议不要再在新项目中使用 C 数组 据我所知斯特鲁斯特鲁普他自己建议不要使用数组 但是否存在显着的性能差异 使用 C 数组new 即使用动态数组 应该避免 存在的问题是您必须跟踪大小 并且需要手动删除它们并执行各种
  • Android CPU 使用情况下的“时钟滴答”到底是什么?

    我目前正在开发一个 Android 项目 我想获得每个进程的总CPU使用率 所以我使用 proc pid stat 的内容 我提到这个答案是为了获取统计数据 现在我得到了所有的 utime stime 等 问题在于 赫兹 的值 答案是每秒的
  • 使用 npm 安装 ws 会导致 node-gyp 出现错误

    我正在与 Windows 10 64 位 节点0 12 7 国家公共管理 2 11 3 我正在学习 MEAN 堆栈教程 我正在尝试运行以下命令 npm install save ws 我收到此错误消息 C Dev workspace Mea
  • 使用 Timegrouper '1M' 按列进行分组和求和会弄乱我的日期索引 pandas python

    该错误已被发现 下面作为解决方案发布的代码片段有效 我的结果的问题根源在于数据源 FEC GOV 我已经找到了它 现在正在继续前进 非常感谢社区就这个问题付出的所有时间 耐心 帮助等 由于建议解决方案适用于 github 网站上找到的片段
  • 在新 MacBook Air M1 上安装 Pandas 时遇到问题

    我最近买了一台新的 MacBook Air M1 但我在安装 Pandas 时遇到了问题 因为预构建的二进制文件不适用于 macOS arm64 如何在 Apple Silicon Mac 上安装 Pandas 也许为时已晚 但对我有用的唯
  • 在路径中找不到程序 g++

    我正在将 Eclipse 用于 C 项目 我通过转到 新建 gt C 项目 gt 可执行文件 gt 空项目 Linux gcc 工具链创建了一个新项目 当我添加新的 c 文件时 出现 在路径中找不到程序 g 我该如何摆脱这个 我什至没有使用
  • 无法从 OAuth Google API 获取已安装应用程序的访问令牌

    我正在创建一个 OAuth 身份验证流程 以便我安装的应用程序的用户可以访问他们的私有 Google 电子表格文档 我正在使用 Adob e ExtendScript 进行编码 因此无法使用 Google 提供的 Javascript 客户
  • 如何在类似于 Matlab blockproc (blockproc) 函数的块中有效地处理 numpy 数组

    我正在寻找一种好方法 可以有效地将图像划分为小区域 单独处理每个区域 然后将每个处理的结果重新组装成单个处理后的图像 Matlab 有一个工具可以解决这个问题 叫做blkproc 取而代之blockproc在较新版本的 Matlab 中 在