前言
最近想要写一个简要的深度学习框架,里面将要运用到大量的数组运算,因此在此处复习一下组合数据类型和numpy矩阵,以便届时能够更加流利的书写相关代码。
一、组合数据类型
Python语言中最常用的组合数据类型有三大类型,分别是集合类型、序列类型和映射类型。
集合类型是一个元素集合,元素之间无序,相同元素在集合中唯一存在。
序列类型是一个元素向量,元素之间存在先后关系,通过序号访问,元素之间不排他。序列类型的典型代表是字符串类型和列表类型。
映射类型是“键—值”数据项的组合,每一个元素是一个键值对,表示为(key,value)。映射类的典型表示是字典类型。
1.集合类型
集合是无序组合,用大括号( { } )表示,他没有索引和位置的概念,集合中的元素可以动态增加或删除。
集合中的元素不可重复,元素类型只能是不可变数据类型,例如整数、浮点数、字符串、元组等,相比较而言,列表、字典和集合类型本身都是可变数据类型,不能作为集合的元素出现。
集合元素之间没有顺序,不能比较,不能排序。将集合类型看成数学中集合即可。以下是常用的集合操作。
操作符及运算 | 描述 |
---|---|
S-T | 返回一个新集合,包括在集合S中但是不在集合T中的元素 |
S&T | 返回一个新集合,包括同时在集合S和集合T中的元素 |
S^T | 返回一个新集合,包括同时在集合S和集合T中非共同的元素 |
SIT | 返回一个新集合,包括集合S和T中的所有元素 |
集合类型的一些常用的操作函数和方法
函数或方法 | 描述 |
---|---|
S.add(x) | 如果数据项x不在集合S中,将x增加到S |
S.remove() | 如果x在集合S中,移除该元素;不在则产生KeyError异常 |
S.clear() | 移除S中所有数据项 |
len(S) | 返回集合S中的元素个数 |
x in S | 如果x是S的元素,返回true;否则返回flase |
x not in S | 如果x不是S中的元素,返回true;否则返回flase |
集合的最后一个重点内容:set()函数。
set(x)函数可以将其他的数据类型变成集合类型,返回结果是一个无重复且排序任意的集合。set()函数也可以生成空集合变量。其次集合类型可以用来去重。见如下:
2.序列类型
序列类型是一维元素向量,元素之间存在先后关系,通过序号访问。如一维数组a[0],a[1],a[2]…通过下标访问特点值。
其次讲一讲下序列类型的索引体系:
- 与我们熟知的编程语言c,c++,java等一样序列类型的正向递增序号是从0开始的,
- 但是python中增加了反向递减序列,从-1开始,下边-1代表倒数第一的元素,-2为导数第二依次类推直到第一个元素。
- 举例:
以序列类型的典型例子元组为例,元组类型在python语言中表示为tuple,一般以小括号和逗号进行组织(,,)
可知t[-3]已经是第一个数了,当下标取-4时,超出下标范围。
常见的序列类型的操作符和函数:
操作符 | 描述 |
---|---|
x in s | 如果x是s的元素,返回True;否则返回False |
x not in s | 如果x不是s的元素,返回True;否则返回 False |
s+t | 连接s+t |
sn或ns | 将序列s复制n次 |
s[i] | 索引,返回序列的第i个元素 |
s[i:j] | 切片,返回包含序列s第i到第j个元素的子序列(不包含第j个元素) |
s[i:j:k] | 步骤切片,返回包含序列s第i到第j个元素以k为步数的子序列 |
len(s) | 序列s的元素个数 |
max(s) | 序列s中的最大元素 |
min(s) | 序列s中的最小元素 |
s.index | 序列s中第一次出现元素x的位置 |
s.count(s) | 序列s中出现x的总次数 |
元组其他重要知识点:
- 元组类型一旦定义不可修改,元组类型的所有操作都可以通过列表类型实现,因此多数情况下都是使用列表(与元组不同的是,列表类型用中括号和逗号表示,下面具体讲)。
- 元组类型主要在python语法相关的场景中使用,例如,当函数返回多个值时,多个返回值以元组类型返回,实际上返回一个数据类型。
除了元组类型外,序列类型中应用最为广泛,最为重要的就是列表类型了。列表类型用中括号表示[, , ,],也可以通过list(x)函数将集合或字符串类型转换成列表类型。list()函数也可以生成空列表。且由于列表是序列类型,上表的所有函数和操作列表都可以通用。
此外列表还有其他的操作方法。
方法 | 描述 |
---|---|
Is.append(x) | 在列表Is最后增加一个元素x |
Is.insert(i,x) | 在列表Is的第i个位置增加一个元素x |
Is.clear() | 删除Is中的所有元素 |
Is.pop(i) | 将列表Is中第i项元素取出并从Is中删除该元素 |
Is.remove(x) | 将列表中出现的第一个元素x删除 |
Is.reverse() | 将列表中的元素进行反转 |
Is.copy() | 生成一个新列表,复制列表s中的所有元素 |
此外还需注意的一点是列表的切片。
- <列表和列表变量>[N:M]:切片获取列表类型从N到M(不包含M)的元素组成的新列表,其中N和M为列表类型的索引序号,可以正向可以反向,且当N>=M时返回空列表。
- <列表和列表变量>[N:M:K]:切片获取列表类型从N到M(不包含M)以K为步长所对应元素组成的列表。
3.映射类型
映射类型是“键-值”数据项的组合,每个元素是一个键值对,即元素是(key,value),元素之间是无序的。
典型的映射类型是字典。python语言中的字典使用大括号{ }建立,每个元素是一个键值对,通过键信息查找对应的值信息,这个过程就叫做映射。对应格式如下:
{<键1>:<值1>,<键2>:<值2>,<键3>:<值3>,<键4>:<值4>}
其次使用大括号可以创建空字典。通过索引和赋值配合,可以向字典中增加元素。
下面介绍字典的操作函数和操作方法。
操作函数 | 描述 |
---|---|
len(d) | 字典d的元素个数 |
min(d) | 字典d中的最小值 |
max(d) | 字典d中的最大值 |
dict() | 生成一个空字典 |
操作方法 | 描述 |
---|---|
d.keys() | 返回所有的键信息 |
d.values() | 返回所有的值信息 |
d.itens() | 返回所有的键值对信息 |
d.get(key,default) | 键存在则返回相应值,否则返回默认值 |
d.pop(key,default) | 键存在则返回相应值,同时删除键值对,否则返回默认值default |
d.popitem() | 随机从字典中取出一个键值对,以元组(key,value)形式返回,同时将该键值对从字典中删除 |
d.clear() | 删除所有的键值对,清空字典 |
二、numpy矩阵
Numpy是Python中科学计算的核心库。它提供了一个高性能的多维数组对象,以及用于处理这些数组的工具。如果你已经熟悉MATLAB,你可能会发现这篇教程对于你从MATLAB切换到学习Numpy很有帮助。
数组(Arrays)
numpy数组是一个值网格,所有类型都相同,并由非负整数元组索引。 维数是数组的排名; 数组的形状是一个整数元组,给出了每个维度的数组大小。
我们可以从嵌套的Python列表初始化numpy数组,并使用方括号访问元素:
import numpy as np
a = np.array([1, 2, 3]) # Create a rank 1 array
print(type(a)) # Prints "<class 'numpy.ndarray'>"
print(a.shape) # Prints "(3,)"
print(a[0], a[1], a[2]) # Prints "1 2 3"
a[0] = 5 # Change an element of the array
print(a) # Prints "[5, 2, 3]"
b = np.array([[1,2,3],[4,5,6]]) # Create a rank 2 array
print(b.shape) # Prints "(2, 3)"
print(b[0, 0], b[0, 1], b[1, 0]) # Prints "1 2 4"
其他定义数组方法:
import numpy as np
a = np.zeros((2,2)) # Create an array of all zeros
print(a) # Prints "[[ 0. 0.]
# [ 0. 0.]]"
b = np.ones((1,2)) # Create an array of all ones
print(b) # Prints "[[ 1. 1.]]"
c = np.full((2,2), 7) # Create a constant array
print(c) # Prints "[[ 7. 7.]
# [ 7. 7.]]"
d = np.eye(2) # Create a 2x2 identity matrix
print(d) # Prints "[[ 1. 0.]
# [ 0. 1.]]"
e = np.random.random((2,2)) # Create an array filled with random values
print(e) # Might print "[[ 0.91940167 0.08143941]
# [ 0.68744134 0.87236687]]"
numpy数组切片:
import numpy as np
# Create the following rank 2 array with shape (3, 4)
# [[ 1 2 3 4]
# [ 5 6 7 8]
# [ 9 10 11 12]]
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
# Use slicing to pull out the subarray consisting of the first 2 rows
# and columns 1 and 2; b is the following array of shape (2, 2):
# [[2 3]
# [6 7]]
b = a[:2, 1:3]
# A slice of an array is a view into the same data, so modifying it
# will modify the original array.
print(a[0, 1]) # Prints "2"
b[0, 0] = 77 # b[0, 0] is the same piece of data as a[0, 1]
print(a[0, 1]) # Prints "77"
import numpy as np
# Create the following rank 2 array with shape (3, 4)
# [[ 1 2 3 4]
# [ 5 6 7 8]
# [ 9 10 11 12]]
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
# Two ways of accessing the data in the middle row of the array.
# Mixing integer indexing with slices yields an array of lower rank,
# while using only slices yields an array of the same rank as the
# original array:
row_r1 = a[1, :] # Rank 1 view of the second row of a
row_r2 = a[1:2, :] # Rank 2 view of the second row of a
print(row_r1, row_r1.shape) # Prints "[5 6 7 8] (4,)"
print(row_r2, row_r2.shape) # Prints "[[5 6 7 8]] (1, 4)"
# We can make the same distinction when accessing columns of an array:
col_r1 = a[:, 1]
col_r2 = a[:, 1:2]
print(col_r1, col_r1.shape) # Prints "[ 2 6 10] (3,)"
print(col_r2, col_r2.shape) # Prints "[[ 2]
# [ 6]
# [10]] (3, 1)"
numpy数组的常用函数:
ndarray.ndim #获取ndarray的维数
ndarray.shape #获取ndarray各个维度的长度
ndarray.dtype #获取ndarray中元素的数据类型
ndarray.T #简单转置矩阵ndarray
项目 | Value |
---|---|
ndarray.ndim | 获取ndarray的维数 |
ndarray.shape | 获取ndarray各个维度的长度 |
ndarray.dtype | 获取ndarray中元素的数据类型 |
ndarray.T | 简单转置矩阵ndarray |
函数 | 作用 |
---|---|
np.array( x) | 将输入数据转化为一个ndarray |
np.array( x, dtype) | 将输入数据转化为一个类型为type的ndarray |
np.asarray( array ) | 将输入数据转化为一个新的(copy)ndarray |
np.ones( N ) | 生成一个N长度的一维全一ndarray |
np.ones( N, dtype) | 生成一个N长度类型是dtype的一维全一ndarray |
np.ones_like( ndarray ) | 生成一个形状与参数相同的全一ndarray |
np.zeros( N) | 生成一个N长度的一维全零ndarray |
np.zeros( N, dtype) | 生成一个N长度类型位dtype的一维全零ndarray |
np.zeros_like(ndarray) | 类似np.ones_like( ndarray ) |
np.empty( N ) | 生成一个N长度的未初始化一维ndarray |
np.empty( N, dtype) | 生成一个N长度类型是dtype的未初始化一维ndarray |
np.empty_like(ndarray) | 类似np.ones_like( ndarray ) |
np.eye( N )/np.identity( N ) | |
np.arange( num) | 生成一个从0到num-1步数为1的一维ndarray |
np.arange( begin, end) | 生成一个从begin到end-1步数为1的一维ndarray |
np.arange( begin, end, step) | 生成一个从begin到end-step的步数为step的一维ndarray |
np.where(cond, ndarray1, ndarray2) | 根据条件cond,选取ndarray1或者ndarray2,返回一个新的ndarray |
np.in1d(ndarray, [x,y,…]) | 检查ndarray中的元素是否等于[x,y,…]中的一个,返回bool数组 |
三、参考文献
[1].全国计算机等级考试二级教程——python编程从入门到实践.高等教育出版社.2021
[2].链接:http://www.numpy.org.cn/article/basics/python_numpy_tutorial.html#python