【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.18 逻辑运算引擎:数组条件判断的智能法则
1.18 逻辑运算引擎:数组条件判断的智能法则
1.18.1 目录
1.18.2 短路逻辑的向量化替代方案
在Python中,短路逻辑(short-circuit logic)是一种常用的逻辑运算方式,但在NumPy数组中使用短路逻辑可能会导致性能问题。向量化操作可以提供更高效的解决方案。
1.18.2.1 短路逻辑的原理
短路逻辑的基本原理是:在逻辑表达式中,如果前一个条件的评估结果已经可以确定最终结果,则不会继续评估后续的条件。例如,“and”运算中,如果第一个条件为False,则后续条件不会被评估。
1.18.2.2 向量化逻辑运算的实现
NumPy提供了向量化逻辑运算的方法,可以在整个数组上进行高效的逻辑运算。
1.18.2.2.1 逻辑运算的广播规则图示
1.18.2.2.2 代码示例
import numpy as np# 创建两个NumPy数组
array1 = np.array([1, 2, 3, 4, 5])
array2 = np.array([3, 4, 5, 6, 7])# 使用向量化逻辑运算
result = np.logical_and(array1 > 2, array2 < 6) # 条件判断# 打印结果
print(result) # 输出: [False False True False False]
1.18.3 复合条件表达式的优化编写
在实际应用中,经常需要编写多个条件的复合表达式。优化复合条件表达式可以显著提高代码的可读性和性能。
1.18.3.1 复合条件表达式的常见问题
- 可读性问题:多个条件嵌套会导致代码难以阅读。
- 性能问题:逐元素判断条件会导致计算效率低下。
1.18.3.2 优化方法
- 使用布尔数组:通过布尔数组进行条件判断,提高代码的可读性和性能。
- 使用numexpr:加速复杂表达式的计算。
1.18.3.2.1 使用布尔数组
import numpy as np# 创建NumPy数组
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])# 生成布尔数组
condition1 = data > 3
condition2 = data < 8# 使用布尔数组进行复合条件判断
result = np.logical_and(condition1, condition2)# 打印结果
print(result) # 输出: [False False False True True True True False False False]
1.18.3.2.2 使用numexpr加速复杂表达式
import numpy as np
import numexpr as ne# 创建NumPy数组
data1 = np.random.randn(1000000)
data2 = np.random.randn(1000000)# 生成复合条件表达式
result = ne.evaluate('(data1 > 2) & (data2 < 6)') # 使用numexpr加速# 打印结果
print(result)
1.18.4 掩码操作在图像分割中的应用
在图像处理中,掩码操作是一种常用的方法,用于提取图像中的感兴趣区域(ROI)。
1.18.4.1 医学图像ROI提取完整案例
假设我们有一个医学图像,需要提取其中的病变区域。我们可以通过生成掩码并应用掩码来实现这一点。
1.18.4.1.1 读取图像
import numpy as np
import matplotlib.pyplot as plt
from skimage import io, color# 读取医学图像
image = io.imread('medical_image.jpg')
image_gray = color.rgb2gray(image) # 转换为灰度图像# 绘制原始图像
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title('原始图像')
1.18.4.1.2 生成掩码
# 生成掩码条件
mask = (image_gray > 0.2) & (image_gray < 0.8)# 绘制掩码
plt.subplot(1, 2, 2)
plt.imshow(mask, cmap='gray')
plt.title('掩码')
plt.show()
1.18.4.1.3 应用掩码
# 应用掩码提取ROI
image_roi = np.where(mask, image_gray, 0)# 绘制ROI图像
plt.figure(figsize=(6, 6))
plt.imshow(image_roi, cmap='gray')
plt.title('ROI图像')
plt.show()
1.18.5 多条件并行评估的性能测试
多条件并行评估可以显著提高代码的执行效率。我们将通过一个性能测试来验证这一点。
1.18.5.1 测试设置
- 数据规模:1000万数据点
- 测试方法:使用NumPy的向量化逻辑运算和逐元素逻辑运算进行对比测试。
1.18.5.1.1 代码示例
import numpy as np
import time# 生成大规模数据
data = np.random.randn(10000000)# 逐元素逻辑运算
def sequential_evaluation(data):result = []for value in data:if value > 0.5 and value < 1.5:result.append(True)else:result.append(False)return np.array(result)# 向量化逻辑运算
def vectorized_evaluation(data):return (data > 0.5) & (data < 1.5)# 测试逐元素逻辑运算
start_time = time.time()
result_sequential = sequential_evaluation(data)
end_time = time.time()
time_sequential = end_time - start_time
print(f"逐元素逻辑运算时间: {time_sequential:.6f}秒")# 测试向量化逻辑运算
start_time = time.time()
result_vectorized = vectorized_evaluation(data)
end_time = time.time()
time_vectorized = end_time - start_time
print(f"向量化逻辑运算时间: {time_vectorized:.6f}秒")# 生成结果图
import matplotlib.pyplot as pltplt.bar(['逐元素逻辑运算', '向量化逻辑运算'], [time_sequential, time_vectorized])
plt.xlabel('方法')
plt.ylabel('时间(秒)')
plt.title('多条件并行评估的性能对比')
plt.show()
1.18.6 逻辑运算的GPU加速方案
对于大规模数据的逻辑运算,可以使用GPU进行加速。我们将介绍如何使用CuPy库在GPU上进行逻辑运算。
1.18.6.1 CuPy库简介
CuPy是一个兼容NumPy的库,支持在GPU上进行高效的数组操作。
1.18.6.1.1 代码示例
import numpy as np
import cupy as cp
import time# 生成大规模数据
data = np.random.randn(10000000)# 将数据转移到GPU
gpu_data = cp.array(data)# 逐元素逻辑运算
def sequential_evaluation(data):result = []for value in data:if value > 0.5 and value < 1.5:result.append(True)else:result.append(False)return np.array(result)# 向量化逻辑运算
def vectorized_evaluation(data):return (data > 0.5) & (data < 1.5)# GPU向量化逻辑运算
def gpu_vectorized_evaluation(gpu_data):return (gpu_data > 0.5) & (gpu_data < 1.5)# 测试逐元素逻辑运算
start_time = time.time()
result_sequential = sequential_evaluation(data)
end_time = time.time()
time_sequential = end_time - start_time
print(f"逐元素逻辑运算时间: {time_sequential:.6f}秒")# 测试NumPy向量化逻辑运算
start_time = time.time()
result_vectorized = vectorized_evaluation(data)
end_time = time.time()
time_vectorized = end_time - start_time
print(f"NumPy向量化逻辑运算时间: {time_vectorized:.6f}秒")# 测试CuPy向量化逻辑运算
start_time = time.time()
result_gpu_vectorized = gpu_vectorized_evaluation(gpu_data)
end_time = time.time()
time_gpu_vectorized = end_time - start_time
print(f"CuPy向量化逻辑运算时间: {time_gpu_vectorized:.6f}秒")# 生成结果图
import matplotlib.pyplot as pltplt.bar(['逐元素逻辑运算', 'NumPy向量化逻辑运算', 'CuPy向量化逻辑运算'], [time_sequential, time_vectorized, time_gpu_vectorized])
plt.xlabel('方法')
plt.ylabel('时间(秒)')
plt.title('逻辑运算的性能对比')
plt.show()
1.18.7 总结
本文详细介绍了NumPy数组条件判断的智能法则,包括短路逻辑的向量化替代方案、复合条件表达式的优化编写、掩码操作在图像分割中的应用、多条件并行评估的性能测试以及逻辑运算的GPU加速方案。通过这些内容,希望读者可以更好地理解和应用NumPy的逻辑运算功能,从而在实际项目中提高代码效率。
1.18.8 参考文献
参考资料名 | 链接 |
---|---|
NumPy官方文档 | https://numpy.org/doc/stable/ |
Matplotlib官方文档 | https://matplotlib.org/ |
Scikit-Image官方文档 | https://scikit-image.org/docs/stable/ |
numexpr官方文档 | https://numexpr.readthedocs.io/en/latest/ |
CuPy官方文档 | https://docs.cupy.dev/en/latest/ |
短路逻辑与向量化操作 | https://eli.thegreenplace.net/2015/understanding-short-circuiting-with-and-and-or-in-python/ |
布尔数组与条件判断 | https://numpy.org/doc/stable/user/basics.indexing.html#boolean-or-mask-index-arrays |
图像处理与ROI提取 | https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_histograms/py_histogram_equalization/py_histogram_equalization.html |
NumPy性能优化 | https://realpython.com/faster-numpy-arrays-cython/ |
CUDA编程入门 | https://developer.nvidia.com/blog/getting-started-cuda-python/ |
GPU加速的Python库 | https://www.tensorflow.org/install/gpu |
数据可视化 | https://seaborn.pydata.org/ |
数据科学手册 | https://jakevdp.github.io/PythonDataScienceHandbook/ |
医学图像处理 | https://pyradiomics.readthedocs.io/en/latest/ |
并行计算 | https://docs.ray.io/en/latest/ |
这篇文章包含了详细的原理介绍、代码示例、源码注释以及案例等。希望这对您有帮助。如果有任何问题请随私信或评论告诉我。
相关文章:

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.18 逻辑运算引擎:数组条件判断的智能法则
1.18 逻辑运算引擎:数组条件判断的智能法则 1.18.1 目录 #mermaid-svg-QAFjJvNdJ5P4IVbV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QAFjJvNdJ5P4IVbV .error-icon{fill:#552222;}#mermaid-svg-QAF…...

EasyExcel写入和读取多个sheet
最近在工作中,作者频频接触到Excel处理,因此也对EasyExcel进行了一定的研究和学习,也曾困扰过如何处理多个sheet,因此此处分享给大家,希望能有所帮助 目录 1.依赖 2. Excel类 3.处理Excel读取和写入多个sheet 4. 执…...
LLM架构与优化:从理论到实践的关键技术
标题:“LLM架构与优化:从理论到实践的关键技术” 文章信息摘要: 文章探讨了大型语言模型(LLM)开发与应用中的关键技术,包括Transformer架构、注意力机制、采样技术、Tokenization等基础理论,以…...

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.22 形状操控者:转置与轴交换的奥秘
1.22 形状操控者:转置与轴交换的奥秘 目录 #mermaid-svg-Qb3eoIWrPbPGRVAf {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Qb3eoIWrPbPGRVAf .error-icon{fill:#552222;}#mermaid-svg-Qb3eoIWrPbPGRVAf…...

NLP模型大对比:Transformer >Seq2Seq > LSTM > RNN > n-gram
结论 Transformer 大于 传统的Seq2Seq 大于 LSTM 大于 RNN 大于 传统的n-gram n-gram VS Transformer 我们可以用一个 图书馆查询 的类比来解释它们的差异: 一、核心差异对比 维度n-gram 模型Transformer工作方式固定窗口的"近视观察员"全局关联的&q…...

DeepSeek部署教程(基于Ollama)
虽说在过年,但不能忘了学习。这几天科技圈最火的莫过于deepseek,我抽空也学习一下deepseek的部署过程,主要还是因为官方服务已经彻底瘫了[手动狗头]。 1、下载Ollama并安装 https://github.com/ollama/ollama/releases/latest/download/Oll…...
Java基础面试题总结(题目来源JavaGuide)
问题1:Java 中有哪 8 种基本数据类型?它们的默认值和占用的空间大小知道不? 说说这 8 种基本数据类型对 应的包装类型。 在 Java 中,有 8 种基本数据类型(Primitive Types): 基本数据类型关键…...

WPS mathtype间距太大、显示不全、公式一键改格式/大小
1、间距太大 用mathtype后行距变大的原因 mathtype行距变大到底怎么解决-MathType中文网 段落设置固定值 2、显示不全 设置格式: 打开MathType编辑器点击菜单栏中的"格式(Format)"选择"间距(Spacing)"在弹出的对话框中调整"分数间距(F…...

宇宙大爆炸是什么意思
根据宇宙大爆炸学说,宇宙间的一切都在彼此远离,而且距离越远,远离的速度越快。我们只能在地球上观察这种现象,而我们观察到的速度符合如下公式,其中 为哈勃常数, 为距离, 为速度(…...
MotionLCM 部署笔记
目录 依赖项 humanml3d: sentence-t5-large 下载数据: 报错:No module named sentence_transformers 继续报错:from transformers.integrations import CodeCarbonCallback 解决方法: GitHub - Dai-Wenxun/Moti…...

VLLM性能调优
1. 抢占 显存不够的时候,某些request会被抢占。其KV cache被清除,腾退给其他request,下次调度到它,重新计算KV cache。 报这条消息,说明已被抢占: WARNING 05-09 00:49:33 scheduler.py:1057 Sequence gr…...
ESP32-S3模组上跑通esp32-camera(39)
接前一篇文章:ESP32-S3模组上跑通esp32-camera(38) 一、OV5640初始化 2. 相机初始化及图像传感器配置 上一回继续对reset函数的后一段代码进行解析。为了便于理解和回顾,再次贴出reset函数源码,在components\esp32-camera\sensors\ov5640.c中,如下: static int reset…...

Linux《基础指令》
在之前的Linux《Linux简介与环境的搭建》当中我们已经初步了解了Linux的由来和如何搭建Linux环境,那么接下来在本篇当中我们就要来学习Linux的基础指令。在此我们的学习是包括两个部分,即指令和关于Linux的基础知识;因此本篇指令和基础知识的…...
9.进程间通信
9.进程间通信 **1. 进程间通信(IPC)概述****2. 无名管道(Pipe)****3. 有名管道(FIFO)****4. 信号通信(Signal)****5. 练习与作业****6. 信号的应用****7. 总结** 1. 进程间通信&…...

Windows中本地组策略编辑器gpedit.msc打不开/微软远程桌面无法复制粘贴
目录 背景 解决gpedit.msc打不开 解决复制粘贴 剪贴板的问题 启用远程桌面剪贴板与驱动器 重启RDP剪贴板监视程序 以上都不行?可能是操作被Win11系统阻止 最后 背景 远程桌面无法复制粘贴,需要查看下主机策略组设置,结果按WinR输入…...

供应链系统设计-供应链中台系统设计(十二)- 清结算中心设计篇(一)
概述 在之前的文章中,我们通过之前的两篇文章中,如下所示: 供应链系统设计-供应链中台系统设计(十)- 清结算中心概念片篇 供应链系统设计-供应链中台系统设计(十一)- 清结算中心概念片篇 说…...
Vue.js 单页应用(SPA)开发教程:从零开始构建你的第一个项目
单页应用(SPA,Single Page Application)是现代前端开发的主流模式。Vue.js 是一个非常适合构建 SPA 的框架,它通过 Vue Router 实现页面导航,通过组件化开发和状态管理实现复杂的交互功能。本篇教程将带你了解 SPA 的基…...
Linux C openssl aes-128-cbc demo
openssl 各版本下载 https://openssl-library.org/source/old/index.html#include <stdio.h> #include <string.h> #include <openssl/aes.h> #include <openssl/rand.h> #include <openssl/evp.h>#define AES_KEY_BITS 128 #define GCM_IV_SIZ…...

你了解哪些Java限流算法?
大家好,我是锋哥。今天分享关于【你了解哪些Java限流算法?】面试题。希望对大家有帮助; 你了解哪些Java限流算法? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Java 中常用的限流算法主要有以下几种,它们广泛应用于处理流量控…...
【漫话机器学习系列】065.梯度(Gradient)
梯度(Gradient) 在数学和机器学习中,梯度是一个向量,用来表示函数在某一点的变化方向和变化率。它是多变量函数的一阶偏导数的组合。 梯度的定义 设有一个标量函数 ,它对 是可微的,则该函数在某一点的…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...