基本数据类型

Python3的六个标准数据类型中:

  • 不可变数据:Number(数字)、String(字符串)、Tuple(元组)
  • 可变数据:List(列表)、Dictionary(字典)、Set(集合)

不可变指的是创建后内存内容不能再被修改,只能创建新的对象来修改

Number

支持int、float、bool、complex(复数),只有一种整数类型int,表示为长整型

在混合计算时,Python会把整型转换成为浮点数

数值的除法包含两个运算符:/返回一个浮点数,//返回一个整数

String

用单引号'或双引号"括起来,同时使用反斜杠\转义特殊字符,如果不想让/发生转义,需要在字符串前面加一个r

字符串的截取的语法格式:变量[头下标:尾下标]

字符串可以用+运算符连接在一起,用*运算符重复

与C字符串不同的是,Python字符串不能被改变

List

是Python中使用最频繁的数据类型,写在方括号[]之间,元素用逗号隔开

和字符串一样,列表可以被索引和切片,也可以使用+操作符进行拼接

列表中的元素是可以改变的

Tuple:

与列表类似,不同之处在于元组的元素不能修改,写在小括号()里,元素之间用逗号隔开

元组也可以被索引和切片,也可以使用操作符+进行拼接

元组中的元素类型可以不相同

Set:

Python中的集合(Set)是一种无序、可变的数据类型,用于存储唯一的元素

集合使用大括号{}表示,元素之间用逗号分隔

集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作

创建一个空集合必须用set()而不是{ },因为{ }是用来创建一个空字典

Dictionary

列表是有序的对象集合,字典是无序的对象集合(类似c++ unordered_map)

字典是一种映射类型,用{ }标识,是一个无序的键(key):值(value)的集合

键(key)必须使用不可变类型,且在同一个字典中,键(key)必须是唯一的

numpy

1
import numpy as np

创建和生成

array函数

1
np.array(object, dtype = None, copy = True, order = None, ndmin = 0)
名称 描述
object 数组或嵌套的数列list
dtype 数组元素的数据类型,可选,一般不用自己指定
copy 对象是否需要复制,可选
order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
ndmin 指定生成数组的最小维度

传入复数数组:

1
arr = np.array([[1+2j,2+3j],[3+4j,4+5j]], dtype= np.complex64)

arange函数

1
np.arange(start, stop, step, dtype)
参数 描述
start 起始值,默认为0
stop 终止值(不包含)
step 步长,默认为1

linspace函数

1
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
参数 描述
start 序列的起始值
stop 序列的终止值,如果endpointTrue,该值包含于数列中
num 要生成的等步长的样本数量,默认为50
endpoint 该值为True时,数列中包含stop值,默认True
retstep 该值为True时,生成的数组中会显示间距,反之不显示

logspace函数

1
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
参数 描述
start 起始值:base ** start
stop 终止值:base ** stop,如果endpointTrue,该值包含于数列中
num 要生成的等步长的样本数量,默认为50
endpoint 该值为True 时,数列中中包含stop值,默认是True
base 对数log的底数

ones/zeros函数

创建出来的 array 默认是 float 类型

1
np.ones(shape, dtype = None, order = 'C')
1
np.zeros(shape, dtype = None, order = 'C')
参数 描述
shape 数组形状
order ‘C’行数组,或者’F’用于 FORTRAN 的列数组

random函数

最重要的API,经常用于随机生成训练或测试数据,神经网路初始化等

1
2
3
4
# 0-1 连续均匀分布
np.random.rand() # 单个数
np.random.rand(3,4) # 数组
np.random.random((3,2)) # 注意区分,random写数组有()
1
2
np.random.uniform(-1,1,(2,3))  # 指定上下界的连续均匀分布
np.random.randint(0,10,(2,3)) # 指定上下界随机整数(离散均匀分布)
1
np.random.randn(2,4)  # 标准正态分布,(2,4)为维度
1
2
# 高斯分布,第一个数为均值,第二个数为标准差
np.random.normal(0,1,(3,5))

推荐使用新的方式生成,rng 是个 Generator,可用于生成各种分布

将size都内置,都需要()

1
2
rng = np.random.default_rng(42)
# Generator(PCG64) at 0x27C7981F900
1
rng.random((3,2)) # 仅random
1
2
rng.uniform(-1,1,(2,3))
rng.integers(0,10,(2,3)) # 等价randint,注意更名
1
rng.standard_normal((2,4)) # 等价randn,注意更名
1
rng.normal(0,1,(3,5))

数组属性

一维数组的秩为1,二维数组的秩为2

属性 说明
arr.ndim 数组的秩(rank),即数组的维度数量或轴的数量
arr.shape 数组的维度,表示数组在每个轴上的大小
arr.size 数组中元素的总个数,等于 np.shape 中各个轴上大小的乘积
arr.dtype 数组中元素的数据类型
arr.itemsize 数组中每个元素的大小,以字节为单位
arr.real 数组中每个元素的实部(如果元素类型为复数)
arr.imag 数组中每个元素的虚部(如果元素类型为复数)

统计函数

1
arr.max(axis=0,keepdims=True) # min同理
参数 描述
axis 0为列,1为行,默认为全部
keepdims 是否保持原有维度,默认False

这个需要特别注意下,很多深度学习模型中都需要保持原有的维度进行后续计算

在统计函数这块axis,keepdims用法都是一样的

1
np.median(arr) # 中位数

分位数

1
np.quantile(arr, q, axis) 
1
2
3
4
a = np.array([[10, 7, 4], [3, 2, 1]])
# 75% 的分位数,就是 a 里排序之后的中位数
print (np.percentile(a, 75))
# 6.25 75%*(6-1)=3.75 锁定索引3和4两个数 4+0.75*(7-4)=6.25

平均求和标准差

使用最多的是「平均值」

1
2
3
4
np.average(arr) # 平均值
np.sum(arr) # 和
np.std(arr) # 标准差
np.var(arr) # 方差
1
2
np.cumsum(arr)  # 累加
np.cumprod(arr) # 累乘

数组操作

从文件读取

加载常用数据格式 保存数据
np.loadtxt() np.savetxt()
np.fromstring() np.save(), np.savez(), np.savez_compressed()
1
np.loadtxt(fname, dtype=None, delimiter=",", comments="#", skiprows=1)
参数 描述
fname 文件的路径
delimiter 指定数据在文件中的分隔符,在CSV文件中通常是逗号
skiprows 指示 loadtxt 函数跳过文件前n行
comment 如果行的开头为"#"则跳过
1
np.fromstring(s, dtype, count=-1, sep=',')
参数 描述
s 输入的字符串
delimiter 指定数据在文件中的分隔符,在CSV文件中通常是逗号
count 需要读取的元素数量,默认为-1,表示读取字符串中的所有元素
sep 字符串中元素之间的分隔符,在CSV文件中通常是逗号

实践:读取 .txt 文件并计算平均值

1
2
data = np.loadtxt("save_data.csv",delimiter=",")
np.average(data)

保存为文件

1
np.savetxt(fname, arr, fmt='%s', delimiter=',', newline='\n', header='', footer='', comments='# ')
参数 描述
fname 文件的路径
arr 要存储的阵列数据
fmt 要存储的数据格式
delimiter 加载分隔符,默认是空格
newline 行分隔符,默认换行符
header 开头字符串(存储为csv文件时可以生成标题)
footer 结尾字符串
comments 文中的注释
1
2
3
4
5
row_string = "20131, 10, 67, 20132, 11, 88, 20133, 12, 98, 20134, 8, 100, 20135, 9, 75, 20136, 12, 78"
data = np.fromstring(row_string, sep=",")
data = data.reshape(6, 3)
# 保存数据
np.savetxt("save_data.csv", data, delimiter=",", fmt='%s')

np.save()保存一个以 .npy 结尾的二进制文件,读取时使用 np.load() 加载这个二进制数据文件

1
np.save(file, arr) 

np.savez()保存.npz文件将多个 array 同时存储

np.savez_compressed() 压缩数据,和np.savez()写法相同,不过压缩了

1
np.savez(file,kwd1=arr1, kwd2=arr2)
1
2
3
4
5
6
7
8
train_data = np.array([1, 2, 3])
test_data = np.array([11, 22, 33])
np.savez("save_data_02.npz", train=train_data, test=test_data)
# np.savez_compressed("save_data_compressed.npz", train=train_data, test=test_data)

npz_data = np.load("save_data_02.npz")
print("train:", npz_data["train"])
print("test:", npz_data["test"])