Python

本文详细介绍了Python与MATLAB在数据格式、数据转换、矩阵运算、NAN处理、函数用法、绘图技巧等方面的区别和操作。内容涵盖数据切片、数组行列转换、NAN处理、矩阵广播机制、数据类型转换、统计函数、图像保存、图例设置、中文标签显示等。此外,还讨论了Python中数组切片、字典赋值和多行连接问题,以及Windows环境下离线安装库函数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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相关

矩阵运算的广播机制

适用于广播机制的几种矩阵格式

数据类型转换

参考链接
数据类型转换函数汇总

  • 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.
pic_center=10*10

数据统计相关函数

求众数 众数
直方图 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
找出满足条件的数并返回对应索引

对ndarray数组找出满足条件的数

统计满足条件的数据个数
  • 针对整个数组,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 projpip 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前面的注释去掉
解决过程就是把图上这个backend Agg前面的注释去掉

7 小技巧

python代码段折叠

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值