程序代码篇---Numpyassert迭代器
文章目录
- 前言
- 第一部分: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。
注意事项
- assert语句在默认情况下是启用的,但可以通过运行Python解释器时使用**-O(优化)标志来禁用所有的assert语句。**
- 应该避免在assert语句中包含复杂的表达式或函数调用,因为它们可能会产生副作用。
- assert语句不应该用于处理运行时错误,而应该用于捕获不应该发生的内部错误。对于用户输入或外部系统产生的错误,应该使用适当的错误处理机制(如try/except)。
- assert语句后面的错误信息应该清晰地描述为什么断言失败,这有助于调试。
断言的用途
- 在开发过程中,作为代码的“检查点”,确保代码按预期工作。
- 在函数或方法的开始处,验证输入参数的合法性。
- 在模块或类内部,确保内部状态的一致性。
总之,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.内置序列类型
- 列表(List)
- 元组(Tuple)
- 字符串(String)
- 字节串(Byte string)和字节数组(Byte array)
2.集合类型
- 集合(Set)
- 字典(Dictionary) - 迭代字典时,默认迭代的是键,但也可以迭代值或键值对。
3.生成器
- 生成器函数(Generator functions) - 使用yield关键字
- 生成器表达式(Generator expressions) - 类似于列表推导式,但是使用圆括号而不是方括号
4.文件对象
- 打开的文件对象可以迭代,每次迭代返回文件的一行。
5.自定义迭代器
- 任何自定义类,只要实现了__iter__()和__next__()方法,就可以创建自己的迭代器。
6.其他内置迭代器
- range对象 - 用于生成一个序列的数字
- zip、map和filter函数 - 它们可以接受多个可迭代对象作为参数,并返回一个迭代器。
7.迭代器工具
itertools模块中的函数,如chain、cycle、repeat等,它们返回的都是迭代器。
迭代器可以处理的数据类型是相当广泛的,几乎所有在Python中需要遍历的集合类型都可以通过迭代器来处理。使用迭代器的好处是它们提供了惰性求值,这意味着数据元素是在迭代过程中按需生成的,而不是一次性加载到内存中,这对于处理大量数据或无限数据流非常有用。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了Numpy、assert、迭代器。