【Python】numpy库中上难度例题4道+详解考察点(多维数组+多层嵌套循环)

题目一:灰度图像中识别并统计特定像素模式的出现次数

题目:

假设你正在开发一个图像处理算法,需要在一个较大的灰度图像中识别并统计特定像素模式的出现次数。给定一个大图像 large_image 和一个较小的模板图像 template,编写一个 Python 函数 find_pattern_count(large_image, template),使用 NumPy 来实现这一功能。

函数应该:

接受两个参数:一个大的二维 NumPy 数组 large_image 表示大图像,以及一个小的二维 NumPy 数组 template 表示模板图像。
在 large_image 中搜索与 template 完全匹配(即像素值相同)的所有子图像。
返回这些匹配的子图像在 large_image 中出现的总次数。
注意:

large_image 和 template 都是 MxN 的灰度图像,其中 M 和 N 分别代表行数和列数。
template 的尺寸一定小于或等于 large_image 的尺寸。

考察点:

1.numpy库,二维数组的构造格式

2.注意循环范围,对于每个元素,要判断它的右,下,右下,所以临界时不能出现下标越界

3.可以用all方法判断整体小块是否相同

代码:

# 解法一 四重循环 逐一判断
import numpy as npdef find_pattern_count(large_image, template):large_h, large_w = large_image.shapetemp_h, temp_w = template.shapecount = 0for i in range(large_h - temp_h + 1):    #循环遍历整个二维数组每个元素for j in range(large_w - temp_w + 1):match = True    # 假设符合for k in range(temp_h):    #以每个元素为所要对比的小块的左上角元素,依次遍历右,下,右下for l in range(temp_w):if large_image[i + k, j + l] != template[k, l]:match = False    # 不符合breakif not match:breakif match:count += 1return count# 示例数据
large_image = np.array([[255, 255, 0, 255, 255],[255, 255, 0, 255, 255],[0, 0, 255, 0, 0],[255, 255, 0, 255, 255],[255, 255, 0, 255, 255]
])template = np.array([[255, 0],[255, 0]
])# 调用函数
count = find_pattern_count(large_image, template)
print("Pattern count:", count)
# 解法二 双重循环 整体判断
import numpy as npdef find_pattern_count(large_image, template):large_h, large_w = large_image.shapetemp_h, temp_w = template.shapecount = 0for i in range(large_h - temp_h + 1):for j in range(large_w - temp_w + 1):if np.all(large_image[i:i + temp_h, j:j + temp_w] == template):    # 使用all函数判断整体小块是否相同count += 1return count# 示例数据
large_image = np.array([[255, 255, 0, 255, 255],[255, 255, 0, 255, 255],[0, 0, 255, 0, 0],[255, 255, 0, 255, 255],[255, 255, 0, 255, 255]
])template = np.array([[255, 0],[255, 0]
])# 调用函数
count = find_pattern_count(large_image, template)
print("Pattern count:", count)

题目二:三维的 numpy 数组

题目:

有一个三维的 numpy 数组 arr,其维度为 (4, 6, 8),
元素值为随机浮点数。使用三重循环将每个元素替换为它与同一维度上相邻元素(如果存在)的平均值。
对于边界元素,只考虑存在的相邻元素

注意点:

1.还是边界问题,注意不能让下标越界,而且讨论一定要全面

2.对于 numpy 数组的 shape 属性shape[0] 表示第一个维度(可以理解为最外层),shape[1] 表示第二个维度,以此类推

3.arr = np.random.rand(4, 6, 8)  # 生成随机测试用例

4.如果在边缘没有相邻元素,就加上本身,为了后面能统一计算,就是无论是不是边界都将所有相邻相加除以6,得到平均值

代码:

import numpy as npdef replace_with_average(arr):new_arr = arr.copy()for i in range(arr.shape[0]):for j in range(arr.shape[1]):for k in range(arr.shape[2]):if i > 0 and i < arr.shape[0] - 1:prev_i = arr[i - 1, j, k]next_i = arr[i + 1, j, k]elif i == 0:prev_i = arr[i, j, k]          # 如果在边缘,就加上本身,为了后面能统一计算,就是无论是不是边界都相加除以6next_i = arr[i + 1, j, k]elif i == arr.shape[0] - 1:prev_i = arr[i - 1, j, k]next_i = arr[i, j, k]if j > 0 and j < arr.shape[1] - 1:prev_j = arr[i, j - 1, k]next_j = arr[i, j + 1, k]elif j == 0:prev_j = arr[i, j, k]next_j = arr[i, j + 1, k]elif j == arr.shape[1] - 1:prev_j = arr[i, j - 1, k]next_j = arr[i, j, k]if k > 0 and k < arr.shape[2] - 1:prev_k = arr[i, j, k - 1]next_k = arr[i, j, k + 1]elif k == 0:prev_k = arr[i, j, k]next_k = arr[i, j, k + 1]elif k == arr.shape[2] - 1:prev_k = arr[i, j, k - 1]next_k = arr[i, j, k]new_arr[i, j, k] = (prev_i + next_i + prev_j + next_j + prev_k + next_k) / 6return new_arrarr = np.random.rand(4, 6, 8)  # 生成随机测试用例
print(replace_with_average(arr))

题目三:二维矩阵相邻元素和最大

题目:

在一个二维矩阵中,找出所有相邻元素之和最大的位置。

注意点:

1.使用random模块生成随机数

2.注意这里是生成随机数去测试,所以每次运行代码得到的结果都是不一样的

3.列表推导式

matrix = [[random.randint(1, 100) for _ in range(cols)] for _ in range(rows)]

这段代码使用列表推导式来创建一个二维列表 matrix 。

rows 表示矩阵的行数,cols 表示矩阵的列数。

外层的列表推导式 [... for _ in range(rows)] 表示要创建 rows 个子列表。

对于每个子列表,内层的列表推导式 [random.randint(1, 100) for _ in range(cols)] 表示生成包含 cols 个元素的列表,每个元素是通过 random.randint(1, 100) 函数随机生成一个 1 到 100 之间(包括 1 和 100)的整数。

最终,matrix 就是一个 rows 行 cols 列的二维矩阵,其中的元素都是随机生成的 1 到 100 之间的整数

4.我们通常用一个下划线_来表示不关心此处具体的变量名是什么,我们只是需要确定的循环数

5.max_sum = float('-inf')初始化max_sum为负无穷大

6.注意边界值的 判断,不可出现下标越界

代码:

import randomrows = 5
cols = 5
matrix = [[random.randint(1, 100) for _ in range(cols)] for _ in range(rows)]max_sum = float('-inf')
max_row = -1
max_col = -1for i in range(rows):for j in range(cols):cur_sum = 0if i > 0:cur_sum += matrix[i - 1][j]if i < rows - 1:cur_sum += matrix[i + 1][j]if j > 0:cur_sum += matrix[i][j - 1]if j < cols - 1:cur_sum += matrix[i][j + 1]if cur_sum > max_sum:max_sum = cur_summax_row = imax_col = jprint(f"最大和的位置: ({max_row}, {max_col}), 最大和: {max_sum}")

题目四:菱形图

题目:

打印出一个由数字组成的菱形图

注意:

for i in range(num_rows // 2 - 1, -1, -1)

只有当range第三个参数被传入为-1的时候才会是逆序的顺序遍历循环

代码:

num_rows = 7  # 总行数for i in range(num_rows // 2 + 1):  # 上半部分for j in range(num_rows // 2 - i):print(" ", end="")for k in range(2 * i + 1):print(i + 1, end="")print()for i in range(num_rows // 2 - 1, -1, -1):  # 下半部分for j in range(num_rows // 2 - i):print(" ", end="")for k in range(2 * i + 1):print(i + 1, end="")print()
   122233333
4444444333332221

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

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

相关文章

2.4GHz射频前端集成芯片:AT2401C芯片中文资料

关于AT2401C的基本资料&#xff1a; AT2401C是一款面向Zigbee&#xff0c;无线传感网络以及其他2.4GHz频段无线系统的全集成射频功能的射频前端单芯片。 那么射频放大器的作用是什么&#xff1f;它是用来放大来自射频信号源的低功率信号&#xff0c;放大到较高的功率后&#xf…

7. 运行时数据区-栈

栈的分类 栈分为Java虚拟机栈还有本地方法栈&#xff1a; Java虚拟机栈&#xff1a;用于保存Java中的方法相关的内容本地方法栈&#xff1a;用于保存在Java中使用native 标记的用C来实现方法 由于hotspot的作者发现使用一个栈就可以保存以上两个部分的内容&#xff0c;所以在…

学习测试14-实战3-复习-使用CANoe打开半成品

数据 链接: https://pan.baidu.com/s/1k0SFq0luDvEbqimFgtfyKg?pwd9a5t 提取码: 9a5t 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 1&#xff0c;导入信号、报文、节点 2&#xff0c;导入数据库 3&#xff0c;导入can代码 4&#xff0c;导入环境变量 5&#x…

CTF竞赛介绍以及刷题网址(非常详细)零基础入门到精通,收藏这一篇就够了

前言 CTF&#xff08;Capture The Flag&#xff09;中文一般译作夺旗赛&#xff0c;在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会&#xff0c;以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。发展至今…

【保姆级教程】Windows 远程登陆 Linux 服务器的两种方式:SSH + VS Code,开发必备

0. 前言 很多情况下代码开发需要依赖 Linux 系统&#xff0c;远程连接 Linux 服务器进行开发和维护已成为一种常态。对于使用Windows系统的开发者来说&#xff0c;掌握如何通过 SSH 安全地连接到 Linux 服务器&#xff0c;并利用 VS Code 编辑器进行开发&#xff0c;是一项必备…

海外问卷调查这个项目怎么样?

大家好&#xff0c;我是橙河老师&#xff0c;今天讲一讲海外问卷调查这个项目怎么样&#xff1f;我自己做这个项目已经有三四年的时间了&#xff0c;在这个行业里算是资深玩家&#xff0c;我自己的工作室也一直稳定在操作这个项目&#xff0c;首先可以肯定的是&#xff0c;这个…

<数据集>棉花识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;13765张 标注数量(xml文件个数)&#xff1a;13765 标注数量(txt文件个数)&#xff1a;13765 标注类别数&#xff1a;4 标注类别名称&#xff1a;[Partially opened, Fully opened boll, Defected boll, Flower] 序…

甄选范文“论企业集成架构设计及应用”软考高级论文,系统架构设计师论文

论文真题 论企业集成架构设计及应用企业集成架构(Enterprise Integration Arhitecture,EIA) 是企业集成平台的核心,也是解决企业信息孤岛问题的关键。企业集成架构设计包括了企业信息、业务过程、应用系统集成架构的设计。实现企业集成的技术多种多样,早期的集成方式是通过…

仕考网:公务员可以报考军队文职吗?

公务员可以报考军队文职考试&#xff0c;但是需要满足前提条件。 对于已经与国家、地方的用人单位建立劳动关系的社会人才&#xff0c;在获得当前用人单位的许可后才可以申请报考。 在面试过程中&#xff0c;考生必须出示一份由其用人单位出具的且加盖公章的同意报考证明。一…

远程文件下载

在本机启动 http 服务&#xff0c;在你要下载文件的目录下输入 cmd &#xff0c;运行 python -m http.server前提条件&#xff1a;本机安装了 python 服务。 查看本机 IP&#xff08;无线局域网 IP&#xff09;&#xff0c;重新开一个窗口&#xff0c;查看本机 IP 地址。 ipc…

【arxiv 2024】Latte: Latent Diffusion Transformer for Video Generation

【arxiv 2024】Latte: Latent Diffusion Transformer for Video Generation 一、前言Abstract1 Introduction2 Related Work3 Methodology3.1 Preliminary of Latent Diffusion Models3.2 The model variants of Latte3.3 The empirical analysis of Latte3.3.1 Latent video c…

C语言 ——— 函数指针数组的讲解及其用法

目录 前言 函数指针数组的定义 函数指针数组的使用 前言 数组是存放一组相同类型数据的存储空间 关于指针数组的知识请见&#xff1a;C语言 ——— 指针数组 & 指针数组模拟二维整型数组-CSDN博客 那么要将多个函数的地址存储到数组中&#xff0c;这个数组该如何定义…

C++中的依赖注入

目录 1.概述 2.构造函数注入 3.setter方法注入 4.接口注入 5.依赖注入框架 6.依赖注入容器 7.依赖注入框架的工作原理 8.依赖注入的优势 9.总结 1.概述 依赖注入是一种设计模式&#xff0c;它允许我们在不直接创建对象的情况下为对象提供其依赖项&#xff1b;它通过将…

云仓技术带来的物流变革影响

1、实时可视性&#xff1a; 云仓技术使物流公司能够实时跟踪和监控货物在供应链中的位置和状态。这种实时可视性提供了更好的货物追踪和管理能力&#xff0c;同时也提高了客户服务的质量。 ———————————————————— 2、仓储优化&#xff1a; 云仓技术可以…

从0开始搭建vue + flask 旅游景点数据分析系统(四):编写前端首页【数据驾驶舱】

本期我们编写数据驾驶舱页面(Dashboard)这个页面。主要任务是引入echarts 组件编写数据驾驶舱页面。 视频教程后续会更新在我的B站&#xff1a;https://space.bilibili.com/1583208775?spm_id_from666.25.0.0 推荐从教程第一集开始从零开始学习&#xff1a;https://blog.csdn…

实验室责任人员管理保障实训系统安全

在智慧校园的实训管理生态中&#xff0c;实验室责任人员的角色犹如精密机器中的关键齿轮&#xff0c;他们不仅是实验室安全与高效运转的守护者&#xff0c;更是实训教学质量的直接塑造者。这一角色的重要性&#xff0c;在智慧校园的数字化转型中得到了前所未有的凸显&#xff0…

Linux系统配置STM32的开发环境(代码编辑,编译,下载调试)

常见的stm32开发都是直接使用keil-MDK工具的&#xff0c;这是个集成开发环境&#xff0c;包含了代码编辑&#xff0c;编译&#xff0c;下载&#xff0c;调试&#xff0c;等功能&#xff0c;而且keil还是个图形化操作工具&#xff0c;直接可以点击图标案件就可以实现编译下载啥的…

Tableau入门|数据可视化与仪表盘搭建

原视频链接&#xff08;up:戴戴戴师兄&#xff09;&#xff0c;文章为笔者的自学笔记&#xff0c;用于复习回顾&#xff0c;原视频下方有原up整理的笔记&#xff0c;更加直观便捷。因为视频中间涉及的细节较多&#xff0c;建议一边操作&#xff0c;一边学习。 整体介绍 可视化…

set,map(java)

前言&#xff1a;要了解set和map&#xff0c;首先需要对搜索树和哈希有一定的了解&#xff0c;才能进一步深入的了解set和map。 1.搜索树 &#xff08;1&#xff09;性质&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点值都小于根节点的值。 若它的右子树不…

【单机锁】实现原理

文章目录 1.互斥锁 sync.Mutex 的实现原理&#xff1b;1.1获取策略有如下两种&#xff1a;1.2sync.Mutex的方案1.2.1具体方案如下&#xff1a;1.2.2转换的条件&#xff1a;1.2.3运行的两种模式&#xff1a;1.2.4两种模式的转换条件1.2.5唤醒标识&#xff1a; 1.3源码走读 2. sy…