python使用文档
Python标准库¶
输入输出¶
# 允许在字符串中插入变量或表达式的值。
print(f'Hello, {name}!')
# format 方法允许您使用占位符 {} 将变量或表达式的值插入到字符串中,然后使用 format 方法中的参数传递这些值。
print("Hello, {}!".format(name))
# 百分号格式化是传统的字符串格式化方法,它使用 % 运算符将变量或表达式的值插入到字符串中
print("Hello, %s!" % name)
json¶
# 字典的更新
norm_dict = {}
norm_dict.update({f"F_{i}": {"max": imax, "min": imin}})
# json的读写
with open("date_map.json", "w") as json_file:
json.dump(date_map, json_file)
with open("date_map.json", "r") as json_file:
date_map = json.load(json_file)
# 判断变量属于哪一类型
if isinstance(my_variable, list):
print("my_variable是一个列表")
# 判断类中是否有其属性
if hasattr(obj, 'my_attribute'):
print("obj具有my_attribute属性")
# 路径判断
os.path.exists(path) # 文件是否存在
os.makedirs(save_dir) # 创建文件夹
util¶
# zip压缩
names = ("John", "Jane", "Jade", "John")
ages = (2, 4, 6)
zipped = zip(names, ages)
for(x,y) in zipped:
print(x,y)
# John 2
# Jane 4
# Jade 6
Numpy¶
维度处理¶
- ndarray = np.expand_dims(x, axis=1) 加dimension length=1的维度 (加在第一位或最后一维也可写作x[np.newaxis, :] or x[np.newaxis])
- ndarray.squeeze()/numpy.squeeze(a, axis=None) 删dimension length=1的维度
- np.transpose(ndarray, axes=(2, 3, 0, 1)) 交换维度
- np.swapaxes(a, axis1, axis2), 交换两个轴的维度
- ndarray.flatten(order='C') order: {‘C’, ‘F’, ‘A’, ‘K’} 展平化, C按行,F按列
- ndarray.ravel(order)/np.ravel(a, order) flatten和ravel用法相同,只不过flatten返回拷贝ravel返回视图,更改ravel()原矩阵也会跟着改变
- ndarray.reshape(shape=(), order='C')/np.reshape(a, newshape=(), order='C')
这里的order可取c或者f,对应C语言索引和Fortran索引,c表示一行一行的展开,f表示一列一列的展开,后重新组合,三维同理,看子矩阵即可
在C语言中的索引顺序是从左到右,从上到下: A[0][0], A[0][1], A[1][0], A[1][1], A[2][0], A[2][1]
而在Fortran语言中则是 从上到下,从左到右 : A[1][1], A[2][1], A[3][1], A[1][2], A[2][2], A[3][2]
统计¶
- np.std(x, axis=None, dtype=None) 计算沿指定轴的标准差,默认
- np.var(x, axis=None, dtype=None) 计算沿指定轴的方差
- np.mean() 均值同上
生成矩阵¶
np.ones(shape=(), dtype)
生成全一阵np.zeros(shape=(), dtype=float)
生成全零阵np.identity(n, dtype)
生成单位阵np.tile(a, reps)
通过重复矩阵a来构造一个新矩阵, rep: a在每个轴上重复的次数np.repeat(a, repeats, axis=None)
重复矩阵中的每个元素np.kron(a,b)
克罗内克积np.vstack([])
垂直vertically顺序堆叠矩阵np.hstack([])
水平horizontally顺序堆叠矩阵np.concatenate(seq=[],axis=0)
按照某一轴拼接矩阵np.stack([], axis=0, dtype=)
,在新维度堆叠矩阵np.block()
从嵌套的块列表中组装一个矩阵,类似与np.array(list[]),只不过这里的list中的元素为矩阵numpy.arange(start, stop, step)
生成等差数列,start默认为0,step默认为1
矩阵乘法¶
- np.dot(a, b) 如果a和b都是一维数组,则它是向量的内积,二维优先使用matmul
- np.matmul(x1, x2) 不管原矩阵多大,都是原矩阵的最后两维点乘,再广播到原矩阵前几维的维度, 和@等价
- np.outer(a,b) 计算两向量外积,也就是列向量乘行向量
np.matmul和np.dot的区别
a = np.ones([9, 5, 7, 4])
c = np.ones([9, 5, 4, 3])
#np.dot(a,c)为分别计算a@b[0] ... a@b[n]
np.dot(a, c).shape
>> (9, 5, 7, 9, 5, 3)
#np.matmul(a,c)计算最后两维矩阵点乘,再广播到前面的9,5的维度中,也就是对应每个子矩阵点乘,前面的维度必须一样
np.matmul(a, c).shape
>>(9, 5, 7, 3)
数据操作¶
np.vectorize(pyfuc)(some func cant broadcast)
定义一个向量化函数,该函数接受嵌套的对象序列或numpy数组作为输入,并返回单个numpy数组或numpy数组元组。向量化函数在输入数组的连续元组上计算pyfuncnumpy.clip(a, a_min, a_max)
将a限制在a_min与a_max中,大于a_max置a_maxnp.ix_
: 从多个序列构建mesh, e.g.a[np.ix_(rows,cols)]
这里如果行列长度不一样直接进行索引会报错,所以使用ix_
np.cumsum(a, axis)
返回沿给定轴的元素的累积和np.where(condition, [x,y])
条件成立时为x,条件不成立时为ynp.where(condition)
当没有[x,y]
时,此函数等价与np.asarray(condition).nonzero()
返回条件成立的索引,索引是元组的形式,取元素索引符合元组的形式
Plt¶
Axes¶
- fig, ax = plt.subplots(nrows, ncols, sharex, sharey) 共享x轴或共享y轴
fig, (ax1, ax2) = plt.subplots(1, 2)
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
fig, ax = plt.subplots()
ax.plot(x, y, label='line')
ax.set_title('Simple plot')
f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax1.plot(x, y)
ax1.set_title('Sharing Y axis')
ax1.set_xlabel('x')
ax1.set_xlim(left= , right= ) # 设置x轴范围
ax2.scatter(x, y)
# 修改刻度值,只是仅仅修改刻度显示
# 例如将刻度值加100并格式化
from matplotlib.ticker import FuncFormatter
def format_x_ticks(x, pos):
return int(x + 100)
# 使用FuncFormatter来应用格式化函数
formatter = FuncFormatter(format_x_ticks)
ax.xaxis.set_major_formatter(formatter)
# 如果想修改成字符
ax.set_xticks(tick=ind, labels=['G1', 'G2', 'G3', 'G4', 'G5'])
颜色:可以使用单个字符来指定颜色,比如'r'表示红色,'b'表示蓝色,'g'表示绿色等。也可以使用英文单词来表示颜色,比如'red'表示红色,'blue'表示蓝色。
标记:标记是在数据点上绘制的符号,例如圆圈、方块、三角形等。可以使用字符来指定标记,例如'o'表示圆圈,'s'表示方块,'^'表示三角形等。
线条样式:可以使用字符来定义线条的样式,比如'-'表示实线,'--'表示虚线,':'表示点线,'-'表示线段等。
Axes.legend()
/ax.legend(['First line', 'Second line'])
图例plt.imshow(X, cmap='viridis', norm=None, aspect=None, vmin=None, vmax=None)
cmp选择合适的色标 官方文档; aspect:轴的横纵比 'equal'/'auto'; vmin和vmax定义了颜色映射覆盖的数据范围。默认情况下,颜色映射覆盖所提供数据的完整值范围。当给出norm时,使用vmin/vmax是错误的
plt.xticks(ticks=None, labels=None)
坐标映射,ticks映射到label, 并显示,如果不指定label,就是把ticks的刻度画出来
-plt.vlines(x,ymin,ymax,color)
画垂直线段
# 由于imshow画出来的图横纵坐标是行数和列数,有时需要指定横纵坐标
plt.xticks(ticks=np.arange(len(theta)), labels=theta) # 把横坐标映射成theta,可以是numpy,list
plt.yticks(ticks=np.arange(0,len(time),10), labels=time[::10]) # 把纵坐标映射成time,由于时刻值很多,yticks默认全都显示,所以要做步长处理
plt.xticks(x) # 有时自动显示的轴不是感兴趣的轴,这样可以指定显示横坐标为x的刻度
pcolor(X,Y,C)
按照xy坐标进行画多边形,比如坐标为X[i],Y[i]
,X[i+1],Y[i]
,X[i],Y[i+1]
,X[i+1],Y[i+1]
构成的矩形中元素都为C[i]
.pcolor(C)
近似等价于imshow
plt.Normalize(vmin, vmax, clip)
用于规定一种norm可以统一颜色mapping范围,超过[vmin,vmax]
的显示由clip决定,false就显示vmin或max
Pandas¶
强烈建议参考kaggle的教程,网址:https://www.kaggle.com/learn/pandas
- pd.read_csv('data.csv', index_col=0), index_col表示指定data.csv中第0列作为DataFrame的列索引
- Data.head(3) 查看一个 DataFrame 的前 n 行,默认参数值为 5
- Data.tail() 查看一个 DataFrame 的末尾 n 行,默认参数值为 - Data.sample(2) 随机抽取一个 DataFrame 的 n 行
- data = Data[Data.date_id==20230123] 取DataFrame列标签date_id为20230123的数据
- pd.DataFrame(data), 由data生成一个DataFrame
- Data.to_csv('data.csv', index=False)
- data.loc[行名,列名] 可以指定多个列[name1, name2]
- data.iloc[行下标,列下标]
data.loc和iloc在索引时,如果使用切片,例如[0:9],iloc和python的切片操作一样不包含最后一个元素,但loc包含最后一个元素,因为loc可以进行字符串索引,比如Data.loc['Apple':'Banana']!!
# 还可以进行这样的访问:
Data.loc[Data.country == 'Italy']
Data.loc[(Data.country == 'Italy')& (Data.points >= 90)]
# 配合条件选择器
# isin 代表 "is in", 可以理解为&
reviews.loc[reviews.country.isin(['Italy', 'France'])]
# isnull and notnull 表示是否为空(Nan)
reviews.loc[reviews.price.notnull()]
- data.set_index("title") 使用现有列(这里为title列)作为索引
- Data['critic'] = 'everyone' 增添列
- Data['index_backwards'] = range(len(reviews), 0, -1)
总结函数¶
- reviews.attribute.describe() 均值,最大值等等...
- reviews.taster_name.unique() 返回taster_name唯一序列
- reviews.taster_name.value_counts() 返回每个taster_name对应的个数
映射¶
- reviews.points.map(lambda p: p - review_points_mean) 返回减去均值的新的Series, 也可以简易写作reviews.points-review_points_mean
- reviews.apply(remean_points, axis='columns') remean_points为自定义方法 如果axis='index'时,需要定义操作行数据的函数
group操作¶
group相当于把一样的标签打包成一个group
# 将points一样的行打包成一个group
reviews.groupby('points').points.count() #等价于 reviews.points.value_counts()
# # 将country,province一样的行打包成一个group
reviews.groupby(['country', 'province']).apply(lambda df: df.loc[df.points.idxmax()]) # idxmax()代表最大的索引
reviews.groupby(['country']).price.agg([len, min, max]) # agg可以同时运行不同的函数
# 对于多标签所得到的group会得到多索引,可以rest_index改回但索引,返回的会多一个长度列,代表这个单索引对应原多索引向量的长度
countries_reviewed.reset_index()
# 按照长度进行排序 默认升序
countries_reviewed.sort_values(by='len')
# 降序
countries_reviewed.sort_values(by='len', ascending=False)
# 按照索引排序
countries_reviewed.sort_index()
# 多个排序列
countries_reviewed.sort_values(by=['country', 'len'])
数据操作¶
# 更改数据类型
reviews.points.astype('float64')
# 替换缺失值,将每个NaN替换为“unknown”。
reviews.region_2.fillna("Unknown")
# 替换
reviews.taster_twitter_handle.replace("@kerinokeefe", "@kerino")
# 更改列名
reviews.rename(columns={'points': 'score'})
# 更改行名 不常用,常用的为 set_index()用现有列更改索引
reviews.rename(index={0: 'firstEntry', 1: 'secondEntry'})
# 行列都有name属性,可以更改这个name属性
reviews.rename_axis("wines", axis='rows').rename_axis("fields", axis='columns')
# 按指定轴拼接两个data
pd.concat([canadian_youtube, british_youtube]) # 默认axis=0 也就是index
# 按列拼接,index相同
left = canadian_youtube.set_index(['title', 'trending_date'])
right = british_youtube.set_index(['title', 'trending_date'])
left.join(right, lsuffix='_CAN', rsuffix='_UK') # 左侧的frame加_CAN的后缀,右侧的frame加_UK的后缀
Torch¶
卷积输出的计算N = (W − F + 2P )/S+1
网络搭建¶
# 网络搭建相关api
nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None) # 一维卷积
其中dilation为膨胀率,会膨胀卷积核增大感受野, group为组操作,具体可参照官方文档, 每个组进行对应的一部分卷积之后拼接起来.方便理解可以参照可视化卷积过程
register_buffer
将某个变量注册进缓冲区,作为常量供模型使用
数据生成¶
# 数据生成相关API
torch.tensor.uniform_(from=0, to=1) # 用均匀分布的随机数填充张量x
torch.from_numpy() # 返回的张量和narray共享相同的内存
torch.split(tensor, split_size_or_sections, dim=0) # 可以理解为切片,返回视图
autograd.Variable() # 强烈反对 现在只需指定requires_grad=True即可
autograd_tensor = torch.randn((2, 3, 4), requires_grad=True)
torch.cat()
拼接在现有维度上类似于split的逆运算torch.stack()
拼接在新增维度上
数据转换¶
torch.clamp(input, min=None, max=None) → Tensor
将tensor截断在范围中torch.transpose(input, dim0, dim1)
将张量两个维度交换Tensor.masked_fill(mask,value)
在mask为true的地方置为value
梯度相关¶
# 梯度回传
Tensor.backward(gradient=None, retain_graph=None, create_graph=False, inputs=None) # gradient相当于对梯度进行加权, retain_graph: 计算图释放, create_graph 构造导数图, input 指定求特定输入的梯度,如果没有则计算全部
autograd.backward(tensors, grad_tensors=None, retain_graph=None, create_graph=False, grad_variables=None, inputs=None) # 指定某一tensor回传
autograd.grad(outputs, inputs, grad_outputs=None, retain_graph=None, create_graph=False, only_inputs=True, allow_unused=False)
对于backward与step可否再循环外的问题,答案是肯定的 参考链接
模型相关¶
# 模型参数
model.load_state_dict(torch.load('', map_location='cpu'))
torch.save(model.state_dict(), savepath)
# 优化器
torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False) # betas用于计算梯度的平均和平方的系数, weight_decay 权重衰减(如L2惩罚), AMSGrad变体
torch.optim.SGD(params, lr, momentum=0, dampening=0, weight_decay=0, nesterov=False) # 动量阻尼, 权重衰减, 使用Nesterov动量
# scheduler
lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1, verb ose=False) # 每个epoch学习率进行gamma的衰减 verbose为打印信息
lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1, verbose=False) # 为每到milestones规定的epoch进行gamma衰减
自定义¶
torch.autograd.Function
可视化¶
# Tensorboard可视化
# 官方文档 https://pytorch.org/docs/stable/tensorboard.html
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter('runs') # 目录为./runs
writer.add_scalar(tag, scalar_value, global_step=None, walltime=None, new_style=False, double_precision=False) # tag: 图的名称 ,scalar_value: 值(纵坐标); global_step: 横坐标
add_histogram(tag, values, global_step=None, bins='tensorflow', walltime=None, max_bins=None) # 柱状图
add_image(tag, img_tensor, global_step=None, walltime=None, dataformats='CHW')
add_images(tag, img_tensor, global_step=None, walltime=None, dataformats='NCHW') # 以dataformats的格式展示tensor
add_figure(tag, figure, global_step=None, close=True, walltime=None) # 展示plt.Figure()
add_graph(model, input_to_model=None, verbose=False, use_strict_trace=True)
Scipy¶
稀疏矩阵构建¶
import scipy.sparse as sp
sp.csc_array((M, N), [dtype])
信号处理¶
scipy.signal.filtfilt(b, a, x, axis=-1)
b: 滤波器的分子系数向量, a:滤波器的分母系数向量, x: 输入信号
MAT文件读写¶
scio.load()
scio.save()
插值¶
scipy.interpolate.interp1d()