程序代码篇---Numpyassert迭代器

news2025/2/2 12:32:42

文章目录

  • 前言
  • 第一部分:Numpy
    • 1. 创建数组
    • 2. 数组索引和切片
    • 3. 数组形状操作
    • 4. 数组运算
    • 5. 数学函数
    • 6. 随机数生成
    • 7. 数组排序
  • 第二部分:assert
    • 基本语法
      • 1.condition
      • 2.error_message
    • 示例
    • 注意事项
    • 断言的用途
  • 第三部分:迭代器
    • 迭代器协议
      • 1.__iter__()
      • 2.__next__()
    • 迭代器的特点
      • 1.惰性求值
      • 2.一次性
      • 3.内存效率
    • 创建迭代器
    • 使用迭代器
    • 迭代器和可迭代对象
    • 可迭代对象
      • 1.内置序列类型
      • 2.集合类型
      • 3.生成器
      • 4.文件对象
      • 5.自定义迭代器
      • 6.其他内置迭代器
      • 7.迭代器工具
  • 总结


前言

以上就是今天要讲的内容,本文简单介绍了Numpy、assert、迭代器。


第一部分:Numpy

在深度学习中,Numpy是一个非常重要的库,因为它提供了强大的多维数组对象和一系列用于处理这些数组的数学函数。以下是深度学习中Numpy的一些常用操作及其示例:

1. 创建数组

import numpy as np

#创建一维数组
a = np.array([1, 2, 3, 4, 5])

#创建二维数组(矩阵)
b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

#创建一个全零数组
c = np.zeros((3, 4))

#创建一个全一数组
d = np.ones((2, 3))

#创建一个单位矩阵
e = np.eye(3)

2. 数组索引和切片

#一维数组索引
print(a[2])  # 输出: 3

#二维数组索引
print(b[1, 2])  # 输出: 6

#切片操作
print(a[1:4])  # 输出: array([2, 3, 4])

#二维数组切片
print(b[0:2, 1:3])  # 输出: array([[2, 3], [5, 6]])

3. 数组形状操作

#获取数组形状
print(b.shape)  # 输出: (3, 3)

#改变数组形状
f = np.reshape(a, (5, 1))
print(f.shape)  # 输出: (5, 1)

#展平数组
g = np.ravel(b)
print(g)  # 输出: [1 2 3 4 5 6 7 8 9]

4. 数组运算

#向量加法
print(a + np.array([1, 1, 1, 1, 1]))  # 输出: array([2, 3, 4, 5, 6])

#矩阵乘法
print(np.dot(b, e))  # 输出: array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

#广播机制
print(a * 2)  # 输出: array([ 2,  4,  6,  8, 10])

5. 数学函数

#计算数组元素的最大值、最小值、平均值
print(np.max(a))  # 输出: 5
print(np.min(a))  # 输出: 1
print(np.mean(a))  # 输出: 3.0

#计算标准差
print(np.std(a))  # 输出: 1.4142135623730951

6. 随机数生成

#生成随机数
random_array = np.random.rand(3, 3)
print(random_array)

#从正态分布中抽取样本
normal_array = np.random.randn(3, 3)
print(normal_array)

7. 数组排序

#排序数组
sorted_array = np.sort(a)
print(sorted_array)  # 输出: array([1, 2, 3, 4, 5])

#对矩阵的每一行进行排序
sorted_matrix = np.sort(b, axis=1)
print(sorted_matrix)

这些操作在深度学习中非常常见,用于初始化参数、处理数据、进行数学运算等。掌握Numpy是进行深度学习研究的基础。

第二部分:assert

在Python中,assert语句是一个用于调试目的的断言工具。它允许开发者测试一个条件表达式,如果该表达式为False,则会引发一个AssertionError异常。这通常用于验证代码中的假设,确保在程序继续执行之前某些条件是正确的。

基本语法

assert condition, [error_message]

1.condition

condition: 一个表达式,如果该表达式为True,则assert语句不做任何事情,程序继续执行。如果表达式为False,则会引发AssertionError。

2.error_message

error_message(可选): 当condition为False时,assert语句引发的AssertionError的附加错误信息。

示例

下面是一些使用assert语句的例子:

简单断言
x = 10
assert x > 0, "x should be positive"
如果x大于0,上面的代码不会有任何输出。但如果x不大于0,则会引发AssertionError,并显示错误信息"x should be positive"。

断言函数参数
def check_positive(number):
    assert number > 0, f"The number {number} is not positive"
    return number

print(check_positive(5))  # 正常执行
print(check_positive(-1)) # 引发AssertionError
在调用check_positive(-1)时,由于-1不是正数,assert语句会引发AssertionError。

注意事项

  1. assert语句在默认情况下是启用的,但可以通过运行Python解释器时使用**-O(优化)标志来禁用所有的assert语句。**
  2. 应该避免在assert语句中包含复杂的表达式或函数调用,因为它们可能会产生副作用。
  3. assert语句不应该用于处理运行时错误,而应该用于捕获不应该发生的内部错误。对于用户输入或外部系统产生的错误,应该使用适当的错误处理机制(如try/except)。
  4. assert语句后面的错误信息应该清晰地描述为什么断言失败,这有助于调试。

断言的用途

  1. 在开发过程中,作为代码的“检查点”,确保代码按预期工作。
  2. 在函数或方法的开始处,验证输入参数的合法性
  3. 在模块或类内部,确保内部状态的一致性
    总之,assert是Python中一个简单但强大的工具,可以用来提高代码的健壮性和可维护性。然而,它应该谨慎使用,避免在生产环境中留下未处理的断言,因为它们可能会在运行时被禁用。

第三部分:迭代器

在Python中,迭代器(Iterator)是一种对象,它能够逐一返回序列中的元素,这种机制允许我们在不暴露底层表示的情况下遍历序列。迭代器是实现迭代协议(iterable protocol)的对象,它必须实现两个方法:iter()next()

以下是关于迭代器的详细介绍:

迭代器协议

迭代器协议是指对象需要提供 iter() 和 next() 两个方法:

1.iter()

iter() 方法返回迭代器对象本身。这是为了使迭代器能够用在for循环和其他需要迭代器的上下文中。

2.next()

next() 方法返回序列中的下一个元素。如果没有元素可返回,则抛出 StopIteration 异常。

迭代器的特点

1.惰性求值

惰性求值:迭代器是惰性的,这意味着它们在需要时才计算下一个值,而不是一次性计算所有值。

2.一次性

一次性:迭代器只能向前移动,不能后退,并且每个元素只能访问一次

3.内存效率

内存效率:迭代器不需要在内存中存储整个序列,这对于大数据集来说非常有用。

创建迭代器

你可以通过定义一个包含 __iter__() 和 __next__() 方法的类来创建迭代器:

class MyIterator:
    def __init__(self, start, end):
        self.current = start
        self.end = end

    def __iter__(self):
        return self

    def __next__(self):
        if self.current < self.end:
            result = self.current
            self.current += 1
            return result
        else:
            raise StopIteration

# 使用迭代器
my_iter = MyIterator(1, 5)
for number in my_iter:
    print(number)
# 输出: 1 2 3 4

在上面的例子中,MyIterator 类实现了迭代器协议,并创建了一个简单的迭代器,它在给定的范围内生成数字。

使用迭代器

迭代器通常与for循环一起使用,但也可以通过直接调用 __next__() 方法来使用:

my_iter = MyIterator(1, 5)
while True:
    try:
        print(next(my_iter))
    except StopIteration:
        break
#输出: 1 2 3 4

迭代器和可迭代对象

迭代器是可迭代对象(iterable)的一种,但不是所有的可迭代对象都是迭代器。可迭代对象是实现了 iter() 方法的对象,该方法返回一个迭代器。例如,列表、元组、字典和集合都是可迭代对象,但它们本身不是迭代器。

你可以使用 iter() 函数来获取任何可迭代对象的迭代器:

my_list = [1, 2, 3]
my_iter = iter(my_list)
print(next(my_iter))  # 输出: 1

总结来说,迭代器是Python中用于逐个访问序列元素的一种机制,它们通过实现特定的方法来支持迭代操作,是Python编程中处理序列数据的一种高效方式。

可迭代对象

迭代器能处理任何实现了迭代器协议(iterable protocol)的数据类型。在Python中,这意味着数据类型必须提供一个**iter()方法**,该方法返回一个迭代器对象。以下是一些常见的可以由迭代器处理的数据类型:

1.内置序列类型

  1. 列表(List)
  2. 元组(Tuple)
  3. 字符串(String)
  4. 字节串(Byte string)和字节数组(Byte array)

2.集合类型

  1. 集合(Set)
  2. 字典(Dictionary) - 迭代字典时,默认迭代的是键,但也可以迭代值或键值对

3.生成器

  1. 生成器函数(Generator functions) - 使用yield关键字
  2. 生成器表达式(Generator expressions) - 类似于列表推导式,但是使用圆括号而不是方括号

4.文件对象

  1. 打开的文件对象可以迭代,每次迭代返回文件的一行。

5.自定义迭代器

  1. 任何自定义类,只要实现了__iter__()和__next__()方法,就可以创建自己的迭代器。

6.其他内置迭代器

  1. range对象 - 用于生成一个序列的数字
  2. zip、map和filter函数 - 它们可以接受多个可迭代对象作为参数,并返回一个迭代器。

7.迭代器工具

itertools模块中的函数,如chain、cycle、repeat等,它们返回的都是迭代器
迭代器可以处理的数据类型是相当广泛的,几乎所有在Python中需要遍历的集合类型都可以通过迭代器来处理。使用迭代器的好处是它们提供了惰性求值,这意味着数据元素是在迭代过程中按需生成的,而不是一次性加载到内存中,这对于处理大量数据或无限数据流非常有用


总结

以上就是今天要讲的内容,本文仅仅简单介绍了Numpy、assert、迭代器。

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

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

相关文章

(笔记+作业)书生大模型实战营春节卷王班---L0G2000 Python 基础知识

学员闯关手册&#xff1a;https://aicarrier.feishu.cn/wiki/QtJnweAW1iFl8LkoMKGcsUS9nld 课程视频&#xff1a;https://www.bilibili.com/video/BV13U1VYmEUr/ 课程文档&#xff1a;https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/Python 关卡作业&#xff1a;htt…

SpringBoot中Excel表的导入、导出功能的实现

文章目录 一、easyExcel简介二、Excel表的导出2.1 添加 Maven 依赖2.2 创建导出数据的实体类4. 编写导出接口5. 前端代码6. 实现效果 三、excel表的导出1. Excel表导入的整体流程1.1 配置文件存储路径 2. 前端实现2.1 文件上传组件 2.2 文件上传逻辑3. 后端实现3.1 文件上传接口…

动态规划DP 背包问题 完全背包问题(题目分析+C++完整代码)

概览检索 动态规划DP 概览&#xff08;点击链接跳转&#xff09; 动态规划DP 背包问题 概览&#xff08;点击链接跳转&#xff09; 完全背包问题 原题链接 AcWiing 3. 完全背包问题 题目描述 有 N种物品和一个容量是 V的背包&#xff0c;每种物品都有无限件可用。 第 i种物…

【cocos creator】【模拟经营】餐厅经营demo

下载&#xff1a;【cocos creator】模拟经营餐厅经营

【深度学习】softmax回归的从零开始实现

softmax回归的从零开始实现 (就像我们从零开始实现线性回归一样&#xff0c;)我们认为softmax回归也是重要的基础&#xff0c;因此(应该知道实现softmax回归的细节)。 本节我们将使用Fashion-MNIST数据集&#xff0c;并设置数据迭代器的批量大小为256。 import torch from IP…

【Redis】set 和 zset 类型的介绍和常用命令

1. set 1.1 介绍 set 类型和 list 不同的是&#xff0c;存储的元素是无序的&#xff0c;并且元素不允许重复&#xff0c;Redis 除了支持集合内的增删查改操作&#xff0c;还支持多个集合取交集&#xff0c;并集&#xff0c;差集 1.2 常用命令 命令 介绍 时间复杂度 sadd …

程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<3>

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。 今天我们来对上一节做一些小补充&#xff0c;了解学习一下assert断言&#xff0c;指针的使用和传址调用…

神经网络的数据流动过程(张量的转换和输出)

文章目录 1、文本从输入到输出&#xff0c;经历了什么&#xff1f;2、数据流动过程是张量&#xff0c;如何知道张量表达的文本内容&#xff1f;3、词转为张量、张量转为词是唯一的吗&#xff1f;为什么&#xff1f;4、如何保证词张量的质量和合理性5、总结 &#x1f343;作者介…

爬取鲜花网站数据

待爬取网页&#xff1a; 代码&#xff1a; import requestsfrom lxml import etree import pandas as pdfrom lxml import html import xlwturl "https://www.haohua.com/xianhua/"header {"accept":"image/avif,image/webp,image/apng,image/sv…

vue框架技术相关概述以及前端框架整合

vue框架技术概述及前端框架整合 1 node.js 介绍&#xff1a;什么是node.js Node.js就是运行在服务端的JavaScript。 Node.js是一个事件驱动I/O服务端JavaScript环境&#xff0c;基于Google的V8引擎。 作用 1 运行java需要安装JDK&#xff0c;而Node.js是JavaScript的运行环…

数据结构 树2

文章目录 前言 一&#xff0c;二叉搜索树的高度 二&#xff0c;广度优先VS深度优先 三&#xff0c;广度优先的代码实现 四&#xff0c;深度优先代码实现 五&#xff0c;判断是否为二叉搜索树 六&#xff0c;删除一个节点 七&#xff0c;二叉收索树的中序后续节点 总结 …

NeetCode刷题第19天(2025.1.31)

文章目录 099 Maximum Product Subarray 最大乘积子数组100 Word Break 断字101 Longest Increasing Subsequence 最长递增的子序列102 Maximum Product Subarray 最大乘积子数组103 Partition Equal Subset Sum 分区等于子集和104 Unique Paths 唯一路径105 Longest Common Su…

Google Chrome-便携增强版[解压即用]

Google Chrome-便携增强版 链接&#xff1a;https://pan.xunlei.com/s/VOI0OyrhUx3biEbFgJyLl-Z8A1?pwdf5qa# a 特点描述 √ 无升级、便携式、绿色免安装&#xff0c;即可以覆盖更新又能解压使用&#xff01; √ 此增强版&#xff0c;支持右键解压使用 √ 加入Chrome增强…

[EAI-027] RDT-1B,目前最大的用于机器人双臂操作的机器人基础模型

Paper Card 论文标题&#xff1a;RDT-1B: a Diffusion Foundation Model for Bimanual Manipulation 论文作者&#xff1a;Songming Liu, Lingxuan Wu, Bangguo Li, Hengkai Tan, Huayu Chen, Zhengyi Wang, Ke Xu, Hang Su, Jun Zhu 论文链接&#xff1a;https://arxiv.org/ab…

[EAI-028] Diffusion-VLA,能够进行多模态推理和机器人动作预测的VLA模型

Paper Card 论文标题&#xff1a;Diffusion-VLA: Scaling Robot Foundation Models via Unified Diffusion and Autoregression 论文作者&#xff1a;Junjie Wen, Minjie Zhu, Yichen Zhu, Zhibin Tang, Jinming Li, Zhongyi Zhou, Chengmeng Li, Xiaoyu Liu, Yaxin Peng, Chao…

DIFY源码解析

偶然发现Github上某位大佬开源的DIFY源码注释和解析&#xff0c;目前还处于陆续不断更新地更新过程中&#xff0c;为大佬的专业和开源贡献精神点赞。先收藏链接&#xff0c;后续慢慢学习。 相关链接如下&#xff1a; DIFY源码解析

hexo部署到github page时,hexo d后page里面绑定的个人域名消失的问题

Hexo 部署博客到 GitHub page 后&#xff0c;可以在 setting 中的 page 中绑定自己的域名&#xff0c;但是我发现更新博客后绑定的域名消失&#xff0c;恢复原始的 githubio 的域名。 后面搜索发现需要在 repo 里面添加 CNAME 文件&#xff0c;内容为 page 里面绑定的域名&…

【Block总结】MAB,多尺度注意力块|即插即用

文章目录 一、论文信息二、创新点三、方法MAB模块解读1、MAB模块概述2、MAB模块组成3、MAB模块的优势 四、效果五、实验结果六、总结代码 一、论文信息 标题: Multi-scale Attention Network for Single Image Super-Resolution作者: Yan Wang, Yusen Li, Gang Wang, Xiaoguan…

移动互联网用户行为习惯哪些变化,对小程序的发展有哪些积极影响

一、碎片化时间利用增加 随着生活节奏的加快&#xff0c;移动互联网用户的碎片化时间越来越多。在等公交、排队、乘坐地铁等间隙&#xff0c;用户更倾向于使用便捷、快速启动的应用来满足即时需求。小程序正好满足了这一需求&#xff0c;无需下载安装&#xff0c;随时可用&…

使用 Tauri 2 + Next.js 开发跨平台桌面应用实践:Singbox GUI 实践

Singbox GUI 实践 最近用 Tauri Next.js 做了个项目 - Singbox GUI&#xff0c;是个给 sing-box 用的图形界面工具。支持 Windows、Linux 和 macOS。作为第一次接触这两个框架的新手&#xff0c;感觉收获还蛮多的&#xff0c;今天来分享下开发过程中的一些经验~ 为啥要做这个…