当前位置: 首页 > news >正文

【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 逻辑运算的广播规则图示
NumPy数组逻辑运算
广播规则
形状对齐
逐元素运算
结果数组
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 逻辑运算引擎&#xff1a;数组条件判断的智能法则 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

最近在工作中&#xff0c;作者频频接触到Excel处理&#xff0c;因此也对EasyExcel进行了一定的研究和学习&#xff0c;也曾困扰过如何处理多个sheet&#xff0c;因此此处分享给大家&#xff0c;希望能有所帮助 目录 1.依赖 2. Excel类 3.处理Excel读取和写入多个sheet 4. 执…...

LLM架构与优化:从理论到实践的关键技术

标题&#xff1a;“LLM架构与优化&#xff1a;从理论到实践的关键技术” 文章信息摘要&#xff1a; 文章探讨了大型语言模型&#xff08;LLM&#xff09;开发与应用中的关键技术&#xff0c;包括Transformer架构、注意力机制、采样技术、Tokenization等基础理论&#xff0c;以…...

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.22 形状操控者:转置与轴交换的奥秘

1.22 形状操控者&#xff1a;转置与轴交换的奥秘 目录 #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 我们可以用一个 图书馆查询 的类比来解释它们的差异&#xff1a; 一、核心差异对比 维度n-gram 模型Transformer工作方式固定窗口的"近视观察员"全局关联的&q…...

DeepSeek部署教程(基于Ollama)

虽说在过年&#xff0c;但不能忘了学习。这几天科技圈最火的莫过于deepseek&#xff0c;我抽空也学习一下deepseek的部署过程&#xff0c;主要还是因为官方服务已经彻底瘫了[手动狗头]。 1、下载Ollama并安装 https://github.com/ollama/ollama/releases/latest/download/Oll…...

Java基础面试题总结(题目来源JavaGuide)

问题1&#xff1a;Java 中有哪 8 种基本数据类型&#xff1f;它们的默认值和占用的空间大小知道不&#xff1f; 说说这 8 种基本数据类型对 应的包装类型。 在 Java 中&#xff0c;有 8 种基本数据类型&#xff08;Primitive Types&#xff09;&#xff1a; 基本数据类型关键…...

WPS mathtype间距太大、显示不全、公式一键改格式/大小

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

宇宙大爆炸是什么意思

根据宇宙大爆炸学说&#xff0c;宇宙间的一切都在彼此远离&#xff0c;而且距离越远&#xff0c;远离的速度越快。我们只能在地球上观察这种现象&#xff0c;而我们观察到的速度符合如下公式&#xff0c;其中 为哈勃常数&#xff0c; 为距离&#xff0c; 为速度&#xff08;…...

MotionLCM 部署笔记

目录 依赖项 humanml3d&#xff1a; sentence-t5-large 下载数据&#xff1a; 报错&#xff1a;No module named sentence_transformers 继续报错&#xff1a;from transformers.integrations import CodeCarbonCallback 解决方法&#xff1a; GitHub - Dai-Wenxun/Moti…...

VLLM性能调优

1. 抢占 显存不够的时候&#xff0c;某些request会被抢占。其KV cache被清除&#xff0c;腾退给其他request&#xff0c;下次调度到它&#xff0c;重新计算KV cache。 报这条消息&#xff0c;说明已被抢占&#xff1a; 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环境&#xff0c;那么接下来在本篇当中我们就要来学习Linux的基础指令。在此我们的学习是包括两个部分&#xff0c;即指令和关于Linux的基础知识&#xff1b;因此本篇指令和基础知识的…...

9.进程间通信

9.进程间通信 **1. 进程间通信&#xff08;IPC&#xff09;概述****2. 无名管道&#xff08;Pipe&#xff09;****3. 有名管道&#xff08;FIFO&#xff09;****4. 信号通信&#xff08;Signal&#xff09;****5. 练习与作业****6. 信号的应用****7. 总结** 1. 进程间通信&…...

Windows中本地组策略编辑器gpedit.msc打不开/微软远程桌面无法复制粘贴

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

供应链系统设计-供应链中台系统设计(十二)- 清结算中心设计篇(一)

概述 在之前的文章中&#xff0c;我们通过之前的两篇文章中&#xff0c;如下所示&#xff1a; 供应链系统设计-供应链中台系统设计&#xff08;十&#xff09;- 清结算中心概念片篇 供应链系统设计-供应链中台系统设计&#xff08;十一&#xff09;- 清结算中心概念片篇 说…...

Vue.js 单页应用(SPA)开发教程:从零开始构建你的第一个项目

单页应用&#xff08;SPA&#xff0c;Single Page Application&#xff09;是现代前端开发的主流模式。Vue.js 是一个非常适合构建 SPA 的框架&#xff0c;它通过 Vue Router 实现页面导航&#xff0c;通过组件化开发和状态管理实现复杂的交互功能。本篇教程将带你了解 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限流算法?

大家好&#xff0c;我是锋哥。今天分享关于【你了解哪些Java限流算法?】面试题。希望对大家有帮助&#xff1b; 你了解哪些Java限流算法? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Java 中常用的限流算法主要有以下几种&#xff0c;它们广泛应用于处理流量控…...

【漫话机器学习系列】065.梯度(Gradient)

梯度&#xff08;Gradient&#xff09; 在数学和机器学习中&#xff0c;梯度是一个向量&#xff0c;用来表示函数在某一点的变化方向和变化率。它是多变量函数的一阶偏导数的组合。 梯度的定义 设有一个标量函数 &#xff0c;它对 ​ 是可微的&#xff0c;则该函数在某一点的…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...