python基础
基本数据类型
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 |
序列的终止值,如果endpoint 为True ,该值包含于数列中 |
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 ,如果endpoint 为True ,该值包含于数列中 |
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 | # 0-1 连续均匀分布 |
1 | np.random.uniform(-1,1,(2,3)) # 指定上下界的连续均匀分布 |
1 | np.random.randn(2,4) # 标准正态分布,(2,4)为维度 |
1 | # 高斯分布,第一个数为均值,第二个数为标准差 |
推荐使用新的方式生成,rng 是个 Generator,可用于生成各种分布
将size都内置,都需要()
1 | rng = np.random.default_rng(42) |
1 | rng.random((3,2)) # 仅random |
1 | rng.uniform(-1,1,(2,3)) |
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 | a = np.array([[10, 7, 4], [3, 2, 1]]) |
平均求和标准差
使用最多的是「平均值」
1 | np.average(arr) # 平均值 |
1 | np.cumsum(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 | data = np.loadtxt("save_data.csv",delimiter=",") |
保存为文件
1 | np.savetxt(fname, arr, fmt='%s', delimiter=',', newline='\n', header='', footer='', comments='# ') |
参数 | 描述 |
---|---|
fname |
文件的路径 |
arr |
要存储的阵列数据 |
fmt |
要存储的数据格式 |
delimiter |
加载分隔符,默认是空格 |
newline |
行分隔符,默认换行符 |
header |
开头字符串(存储为csv文件时可以生成标题) |
footer |
结尾字符串 |
comments |
文中的注释 |
1 | row_string = "20131, 10, 67, 20132, 11, 88, 20133, 12, 98, 20134, 8, 100, 20135, 9, 75, 20136, 12, 78" |
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 | train_data = np.array([1, 2, 3]) |