如何将一个2D数组切分成多个块

news2024/9/9 4:02:56

要将一个2D数组切分成多个块,可以考虑使用以下几种方法,具体取决于如何定义块的划分规则和需求。如果你希望将2D数组均匀地切分成固定大小的小块,可以使用简单的循环和切片操作。

在这里插入图片描述

1、问题背景

Python 中, 如果有一个 raw 数据文件,将其读入到字节缓冲区(python 字符串),其中每一个数据值代表一个2d 数组中 8 位像素。已知此图片的宽度和高度,想将图片切分成多个块,并且每一个块的面积必须大于最小块面积(如:1024 字节),小于最大块面积(如:2048 字节)。这些块的高度和宽度是任意的,只要满足面积约束即可,并且块的大小不必相同。此外,输入数据的长度也不一定是2的幂。

2、解决方案

方法一:

为了代码尽量简洁,可以将数据存储为按行存储的行。

import collections
import operator

def split_(seq, size):
    return [seq[i:i+size] for i in range(0,len(seq),size)]

def split_image(data, width, height, MIN_AREA, MAX_AREA):

    tiles = list()
    if width >= MIN_AREA:
        # 每行可以细分为多个块
        tile_width = width / (width / MIN_AREA) # 整数除法
        rows = split_(data, width)
        row_tiles = [split_(row, tile_width) for row in rows]
        tiles = reduce(operator.add, row_tiles)
    elif width < MIN_AREA:
        # 每个块由多行组成
        min_tile_height = int(MIN_AREA / width) + 1
        tile_height = height / (height / min_tile_height)
        tile_size = tile_height * width
        tiles = split_(data, tile_size)
        if len(tiles[-1]) < MIN_AREA:
            if (tile_height > 2):
                tiles[-2] += tiles[-1]
                del tiles[-1]
            else: # tile_height == 2, the case 1 don't pass here
                # 特殊情况,我们需要垂直分割最后三行
                # 如果宽度也是3,那么我们就遇到了问题,但如果我们在这里
                # 那么MIN_AREA为4,MAX_AREA为8,行数大于等于5
                if width > 3:
                    last_three_rows = split_(tiles[-2] + tiles[-1], width)
                    tiles[-2] = reduce(operator.add,[row[:width/2] for row in last_three_rows])
                    tiles[-1] = reduce(operator.add,[row[width/2:] for row in last_three_rows])
                else: # width = 3 and MIN_AREA = 4
                    last_five_rows = reduce(operator.add, tiles[-3:])
                    three_columns = [last_five_rows[i::3] for i in range(3)]
                    tiles[-3:] = three_columns

    return tiles

方法二:

如果是在处理图片,可以使用 PIL(Python Imaging Library)。

import Image

def split_image(imagefile, MIN_AREA, MAX_AREA):

    i = Image.open(imagefile)

    width, height = i.size
    data = list(i.getdata())

    tiles = list()
    if width >= MIN_AREA:
        tile_width = width / (width / MIN_AREA) # 整数除法
        for y in range(0, height, tile_width):
            for x in range(0, width, tile_width):
                box = (x, y, x + tile_width, y + tile_width)
                region = i.crop(box)
                tiles.append(list(region.getdata()))
    elif width < MIN_AREA:
        min_tile_height = int(MIN_AREA / width) + 1
        tile_height = height / (height / min_tile_height)
        tile_size = tile_height * width
        for y in range(0, height, tile_height):
            for x in range(0, width):
                box = (x, y, x + width, y + tile_height)
                region = i.crop(box)
                tiles.append(list(region.getdata()))

    return tiles

函数 split_image 将图像切成块,并将每个块的数据存储到一个列表中。然后可以对每个块单独处理。

有时候需要根据块的形状或大小来划分数组,这可能需要使用图像处理库或者几何算法来检测并划分块。这些示例展示了如何根据不同的需求将2D数组切分成多个块。具体选择哪种方法取决于我们的应用场景和数据结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1918227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP与税控系统集成案例

一、项目背景 重庆润通控股有限公司成立于2007年&#xff0c;是一家集合汽柴油动力及终端、摩托车、储能电源、汽车零部件、金融服务等产业的多元化集团公司。 大量订单数据导致订单业务会很复杂&#xff0c;为提供订单完成质量&#xff0c;引入税控系统服务商进行订单开票…

docker笔记2

docker笔记2 一、阿里云镜像配置二、docker基本原理1.docker是如何启动一个容器的2.docker的底层原理 三、镜像命令总结 一、阿里云镜像配置 配置镜像的目的 由于Docker Hub等公共镜像仓库的服务器可能位于国外&#xff0c;直接从中拉取镜像时可能会遇到网络延迟或不稳定的问…

硬盘模式vmd怎么改ahci_电脑vmd改ahci模式详细步骤

最近有很多网友问&#xff0c;我新买的电脑安装原版win10或win11找不到驱动器呀&#xff0c;进入第三方pe又找不到硬盘&#xff0c;找到硬盘安装后又出现安装蓝屏的情况&#xff0c;新机器怎么回事呀&#xff1f;这位网友内心有点崩溃&#xff0c;不知道啥原因。其实这些都是由…

magma软件许可优化解决方案

Magma软件介绍 MAGMA在90年代初通过代理进入中国市场。为了更好快速的服务中国的客户、带来更便捷的、中文语言的技术支持和培训&#xff0c;2009年&#xff0c;MAGMA德国在中国正式设立分公司&#xff0c;即迈格码&#xff08;苏州&#xff09;软件科技有限公司&#xff08;以…

Nodejs 第八十章(Kafka高级)

kafka前置知识在前几章章讲过了 不再复述 Kafka集群操作 1.创建多个kafka服务 拷贝一份kafka完整目录改名为kafka2 修改配置文件 kafka2/config/server.properties 这个文件 broker.id1 //唯一broker port9093 //切换端口 listenersPLAINTEXT://:9093 //切换监听源启动zooKe…

MySQL DDL

数据库 1 创建数据库 CREATE DATABASE 数据库名 CREATE DATABASE IF NOT EXISTS 数据库名;&#xff08;判断是否存在) CREATE DATABASE 数据库名 CHARACTER SET 字符 2 查看数据库 SHOW DATABASES; 查看某个数据库的信息 SHOW CAEATE DATABASE 数据库名 3 修改数据库 …

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 找单词(200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

AIDL通讯机制

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Android ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 正文 1、接口定义 2、数据传输 3、Binder机制 4、使用场景 5、线程安全 我的其他博客 正文 AIDL通讯机制 它是android平台上用于实现…

vue创建项目失败(Error: EPERM: operation not permitted)

项目报错&#xff0c;not permitted是不允许、没有权限&#xff0c;解决方法就是需要改一下node所在盘下面的权限 npm ERR! code EPERM npm ERR! syscall mkdir npm ERR! path C:\Program Files\nodejs\node_cache\_cacache npm ERR! errno -4048 npm ERR! Error: EPERM: opera…

【python算法学习1】用递归和循环分别写下 fibonacci 斐波拉契数列,比较差异

问题&#xff1a; fibonacci 斐波拉契数列&#xff0c;用递归和循环的方法分别写,比较递归和循环的思路和写法的差别 最直接的思路&#xff0c;是写递归方法 循环方法的稍微有点绕&#xff0c;我觉得问题主要是出在&#xff0c;总结循环的通项公式更麻烦&#xff0c;难在数学…

2008年下半年软件设计师【下午题】真题及答案

文章目录 2008年下半年软件设计师下午题--真题2008年下半年软件设计师下午题--答案 2008年下半年软件设计师下午题–真题 2008年下半年软件设计师下午题–答案

FPGA上板项目(一)——点灯熟悉完整开发流程、ILA在线调试

目录 创建工程创建 HDL 代码仿真添加管脚约束添加时序约束生成 bit 文件下载ILA 在线调试 创建工程 型号选择&#xff1a;以 AXU9EG 开发板为例&#xff0c;芯片选择 xczu9eg-ffvb1156-2-i 创建 HDL 代码 注意&#xff1a;由于输入时钟为 200MHz 的差分时钟&#xff0c;因此…

安卓 APK 安装过程详解

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Android ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 1. 开机后连上网线 2. 查看网线的IP地址 3. 检查ADB连接 4. 修改文件权限 步骤 结语 我的其他博客 前言 在安卓设备上安装…

商家为何疯狂送钱?用户如何省钱?一篇文章带你了解!

大家好&#xff0c;我是你们的电商策略伙伴吴军。今天&#xff0c;我将带大家走进一个颠覆传统、充满活力的商业模式——循环购模式。你是否曾听说过“消费1000&#xff0c;回馈2000”的诱人宣传&#xff1f;又或者&#xff0c;每天动动手指就能领钱&#xff0c;而且这些钱还能…

微信开发授权登录梳理总结

授权登录流程对比 微信公众号/网页 微信文档地址&#xff1a;https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html 流程图如下&#xff1a; 特殊说明&#xff1a; 步骤1拼接的微信地址是&#xff1a;https://open.weixin.qq…

用Qwt进行图表和数据可视化开发

目录 Qwt介绍 示例应用场景 典型QWT开发流程 举一些Qwt的例子&#xff0c;多绘制几种类型的图像 1. 绘制折线图 (Line Plot) 2. 绘制散点图 (Scatter Plot) 3. 绘制柱状图 (Bar Plot) 4. 绘制直方图 (Histogram) Qwt介绍 QWT开发主要涉及使用QWT库进行图表和数据可视化…

为什么广告需要教育视频

教育视频作为一种广告工具越来越受欢迎&#xff0c;因为它们能够有效地传达信息并吸引观众的注意力。以下是需要此类视频的几个关键原因&#xff1a; 提高参与度 互动性&#xff1a;教育视频吸引注意力&#xff0c;让观众长时间参与&#xff0c;并让他们参与学习过程。产品演…

简过网:“三支一扶”这些政策你知道吗?

你好小编&#xff0c;我最近打算备考三支一扶&#xff0c;能介绍一些关于三支一扶的相关知识吗&#xff1f; 为了让大家更好的了解三支一扶&#xff0c;下面这篇文章&#xff0c;小编以问答的方式给大家介绍&#xff0c;希望能够帮助到你&#xff01; 1、什么是三支一扶&#…

ArcGIS识别不GDB文件地理数据库显示为空?

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 我们经常会碰到拷贝的GDB文件ArcGIS无法识别&#xff0c;软件只是把他当做普通的文件夹去看待&am…

深度学习论文: Efficient Modulation for Vision Networks

深度学习论文: Efficient Modulation for Vision Networks Efficient Modulation for Vision Networks PDF:https://arxiv.org/pdf/2403.19963 PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks 1 概述 本文提出高效调制&#xff0c;一种新颖的高效视觉网络设计…