Python
关于Python的一些使用记录,如侵即删。
python 基础学习参考链接
1 关于数据格式
与matlab数据格式的小区别
python的下标从0开始,与matlab从1开始相区分。
python的数据切片是“前包括 后不包括”
python中写a[1:5],实际上是取a中下标为“1-4”的元素,即实际中的第2~5个元素。
python的数据用[ ]选择数据下标,( )用于函数调用;而matlab用( )选择数据下标。注意区分。
python中若对数组采用了( )调用,会出现如下错误:
SyntaxError: can’t assign to function call.
python 与 matlab 数据相互调用
-
python中使用.mat数据文件
matlab中保存:python中调用:
from scipy import io
data = io.loadmat(pathname + 'data.mat')['data']
-
matlab中使用python的数据
python保存:
io.savemat('filename.mat', {'VariableNameInMatlab': VariableNameInPython})
matlab调用:
Variable= load([pathname, '\filename.mat']).VariableNameInMatlab;
数组或矩阵 转换到一行或一列,及任意多行多列
data=np.zeros(64, 26)
:64*26- 转换到1664 * 1,即一列:
data1=np.reshape(data, (np.size(data), 1))
;也可以data1=data.reshape(-1,1)
,这里-1代表自动计算元素数目,并以该数目作为行数 - 转换到1*1664, 即一行:
data2=np.reshape(data, (1,np.size(data)))
;也可以data2=data.reshape(1, -1)
,原理同上 - 转换到两列:
data3=data.reshape(-1, 2)
- 转换到两行:
data4=data.reshape(2, -1)
- 转换回64行26列:
data5=data4.reshape(64,26)
数组行列数目
NAN相关
- np.nan是float类型的数据,如果A的数据类型定义为整数int,对A赋值nan:A=np.nan,最终会显示A=-2147483648,解决方法是修改A的数据类型为float。nan变-2147483648的原因1,nan变-2147483648的原因2
矩阵运算的广播机制
数据类型转换
- list-列表:使用方括号
list基本操作相关函数
list.append(‘Google’) ## 使用 append() 添加元素,注意此语法没有返回值,若a=list.append(‘Google’),则a=None
del list1[2] ## 使用 del 语句来删除列表的元素 - tuple-元组:使用小括号;元组的元素不可修改;任意无符号的对象,以逗号隔开,默认为元组
- array-数组:
增删改查# 增加数组元素(需为数组同类型元素)的方法有append(x),insert(i, x)及extend(iterable) - set
2 常见函数用法
python一些数学函数的应用基于numpy库和math库:
np.log10(…)
from math import sqrt
查看列表长度:len(list)
查看矩阵、数组维度:array.shape()
转到一维向量:x = x.flatten()
range
- 创建一个整数列表,常用于for循环。
- 常用格式:range(start, stop, step), 即从start开始,以step为步长,取值到stop。
- 注意,stop这个值是取不到的!
start默认为0。
step默认为1, 可以为负数,此时stop应该小于start。但是,若没有定义step的值,它默认为1,同时输入stop小于start时,只能得到一个空列表,如果在for循环中出现这个问题,就会导致循环进不去:
range不能对小数操作,如果有需要,可以用np.arange,用法如下:
for diameter in np.arange(0.01,8,8./1024):
更多参考链接: link.
数据统计相关函数
求众数 众数
直方图 np.hist
找出满足条件的数并赋值
print(a[a>0]) #输出a中大于0的数
b[b<=0] = 2 #把b中小于等于0的数赋值为2
c = np.where(a>0,a,5) #保留a中大于0的值,不大于0的设为5
c = np.where(a>0,-5,5) #大于0的设为-5,不大于0的设为5
找出满足条件的数并返回对应索引
统计满足条件的数据个数
- 针对整个数组,np.count_nonzero()获得True的数量,即满足条件的元素的数量
print(np.count_nonzero(a < 4))
print(np.count_nonzero(a % 2 == 1))
print(np.sum(a < 4))
print(np.sum(a % 2 == 1))
- 计算ndarray的每一行和每一列满足条件的元素数
在二维数组的情况下,将在参数axis= 0的列中进行处理,在axis= 1的行中进行处理
print(np.count_nonzero(a < 4, axis=0))
print(np.count_nonzero(a < 4, axis=1))
print(np.count_nonzero(a % 2 == 1, axis=0))
print(np.count_nonzero(a % 2 == 1, axis=1))
numpy.any()
numpy.all()
如果要组合多个条件,请将每个条件表达式括在()中,并将其与&或|连接
详见有条件数据统计
3 画图相关
按要求生成图片并保存
import matplotlib.pyplot as plt
1. 分辨率:
plt.rcParams['figure.dpi'] = 600
2. 尺寸
plt.rcParams['figure.figsize'] = (3.5, 1.75) #对应生成的图片宽和高,单位:英寸
3. 画布个数
plt.figure就只有一个画布,重复在上面画;plt.figure()加个括号就会新建一个画布。
4. 保存图片
plt.savefig('路径/'+'图名.png', bbox_inches = 'tight')
bbox_inches = 'tight’是为了使坐标轴标签更紧凑?
5. 中文标签显示
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
6. 图窗和画布
plt的返回对象解释
图片内容设置
1. 连续曲线设置
plt.plot(x, y, '-*', markersize=5, linewidth=2, label='legend_char', color='g', linestyle='--')
在plot里用label属性写了图例后,还是需要写一句plt.legend()才能正常显示图例
plot里的点的大小由markersize或ms控制
2. 离散曲线设置
plt.scatter(x,y,s=16.,color=(0.,0.5,0.))
scatter里点的大小由s控制, 并且scatter里s和plot()的markersize大小的平方相同,即[s]=markersize**2,参考链接
3. 坐标轴设置
font = {'family' : 'Times New Roman', #字体设置
'weight' : 'normal', #笔画深浅设置
'size' : wordsize, #字体大小设置
}
plt.xlabel('xlabel', font)
plt.ylabel('ylabel', font)
4. 图例设置
注意这里有个prop
plt.legend(['legend1','legend2','legend3'], prop=font)#$\lambda$
plt.legend(loc="best",markerscale=2.,numpoints=2,scatterpoints=1,fontsize=12)
图例内容可以这样统一设置,也可以在plot里单独写,见本节1.
loc:图例拜访位置,‘best’为自适应寻找最佳位置;
markerscale:用于调节legend中点是实际图中点大小的markerscale倍,参考markerscale;
numpoints与scatterpoints:
numpoints参数做用于调整用线条画出的点,即用plot()画出的点,legend中的点的数目,而scatterpoints参数做用于调整用散点图画出的点,即scatter()画出的点,legend中的点的数目,参考legend中点数
5. 标题设置
plt.title('Impact of ', font)
6. 刻度设置
fig, ax = plt.subplots() #需要先把坐标轴属性ax取出来
plt.tick_params(labelsize=5) #刻度字体大小设置
labels = ax.get_xticklabels() + ax.get_yticklabels() #刻度字体类型设置
[label.set_fontname('Times New Roman') for label in labels]
7. 散点形状、颜色、连续图用点强调
Marker_Set = [ 'v', '*', '.', '+']
line_set = ['-', '--', '-.', '-o', '-*', '-+']
颜色名称参考:matplotlib颜色表
系统默认颜色调用:默认颜色调用
也可以用RGB比例调色:color=[1,0,0.1]
控制连续线条种类的字符串:连续线条种类
8. 添加网格
plt.grid()
9. 中文标识显示
中文论文字体多要求为宋体,这里以宋体为例。
import matplotlib.pyplot as plt
config = {
"font.family":'serif',
"font.size": 6,
"mathtext.fontset": 'stix',
"font.serif": ['SimSun'],#'Microsoft YaHei' SimSun
}
plt.rcParams.update(config)
plt.figure()
plt.rcParams['font.serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus']=False # 不加这句可能导致坐标轴上的负号消失
plt.title('中文标题示例')
plt.show()
结果图为
应用过程中,可能出现的问题是Font 'default' does not have a glyph for '\u901f' [U+901f], substituting with a dummy symbol.
本次解决方案为:把plt.rcParams['font.serif'] = ['SimSun']
添加到中文显示那行命令之前:
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.xlabel('速度($m s^{-1}$)', font)
猜测可能是这两行命令之间有其他设置时,可能无意更改到某种属性,导致错误。
11. 利用子坐标画局部放大图
12. 设置颜色渐变条-colorbar的颜色范围设置
13.设置colorbar数值范围 plt.clim(0, 150)
二维伪彩色图
使用pcolor 和 pcolormesh时需要将数据z转置,原因见pcolor应用简介
4 其他常见问题
数组切片问题
Zdr = Zdr[0, 0, [0, 4], :, :, :]
即取第一维的第一列,第二维的第一列,第三维的1~5列,第四、五、六维的全部数据
字典赋值问题
用变量temp对字典S_back的值赋值时,如果直接写S_back[n_diameter] = temp,那后面修改temp的值时,S_back[n_diameter]的值会自动跟着变,因此这里需要用深拷贝,如红框中所示,这样写,后面修改temp的值就不会自动修改字典的值了。
多行连接问题
python中较长的语句如果一行写不完可以用“\”来连接多行语句,在(),{},[] 中无需用“\”连接
5 库安装
windows10 python3.7.6安装cartopy
-
尝试1【失败】
cmd进入命令行后,直接pip install cartopy
,根据报错可知,原因是缺少一些依赖库(大意是proj和GEOS未安装或者版本过低),继续pip install proj
,pip install GEOS
,安装好这两个依赖库后,再次pip install cartopy显示安装成功,但是在python运行到import cartopy时却报错如下图:找不到指定的模块
-
尝试2【失败】
根据Python3.8安装cartopy报错ImportError: DLL load failed while importing trace: 找不到指定的模块。以及python导入cartopy提示 ImportError: DLL load failed while importing trace: 找不到指定的模块等的介绍,这个问题应该是由cartopy和依赖包版本不匹配导致的,都建议从python库whl文件下载链接下载whl文件来安装,以保证版本匹配。
如上图安装完毕后,运行python依旧显示“找不到指定的模块”。 -
尝试3【成功!】
根据cartopy系列教程获知,Windows下安装cartopy最好基于conda命令安装,即cmd进入命令行,然后运行conda install -c scitools cartopy
,但尝试后发现这个命令安装cartopy会出现“You will need to adjust your conda configuration to proceed. ”的错误,然后安装失败。根据链接的介绍,这个问题是由于当前设定的镜像源已经不支持该包了,所以需要重新设定。首先运行conda config --remove-key channels
删除设定的镜像地址,然后再运行conda install -c scitools cartopy
后,出现“是否更新一些已有的依赖库”的询问,选择更新后,cartopy就安装成功了!python里import cartopy也没有问题了!
windows10 基于setup.py文件离线安装库函数
- 打开setup.py所在文件夹,按住shift后点击鼠标右键,点击“在此处打开power shell窗口”,然后在弹出的Windows powershell 窗口输入“python setup.py install”,
等待安装,安装结束后显示如下
6 各类报错
-
numpy.hist 尝试获取索引为9223372036854775808的值(int64的最小值)【IndexError: index -9223372036854775808 is out of bounds for axis 1 with size 101】:
这是一个已知的bug https://github.com/numpy/numpy/issues/8627【Bug in np.histogram when min == max and values are >= 2**53】,已经存在了大约2年 -
PyCharm提示 Backend Qt5Agg is interactive backend. Turning interactive mode on.
参考链接
使用这个链接里的方法一解决了这个报错。解决过程就是把图上这个backend Agg前面的注释去掉