奇技淫巧第7期

终于腾出时间了,现在对3~11月份知识点作总结。
这段时间主要在写论文,跑案例分析。暑期的比赛另写了一个小系列,这里就不再写了。
总的来说,零散的代码知识点在积累几个月后还是要汇总回顾一下的。

Python 歪门邪道

fnmatch

http://c.biancheng.net/view/2543.html
在数据处理操作中,只需要使用简单的通配符就能完成文件名的匹配,则使用 fnmatch 模块是不错的选择。
但比正则表达式弱一些

shutil.copy

shutil.copy 能复制的不只有文件,还可以复制文件夹。
此外,对于 shutil 库的安装,经过验证,普通新建环境
conda create -n test001 python=3.8
即可自带 shutil

append & extend

https://www.cnblogs.com/subic/p/6553187.html
二者的区别是,append 将对象整体打包,接入列表的末尾。
extend 将对象看作一个序列,接在原列表的末尾,当然了,前提是,该对象是一个可拆序列

set 对象的运算

set 是python中类似哈希表的对象。
使用 add(), remove() 方法可以轻松添加或去除元素
此外,集合间的运算,也可以由 & | - ^ 等符号实现
不常用的是
| :求并集,
^:二者并集减去差集

subprocess.run()

相对于 os.system()
subprocess.run() 有一个非常好用的参数:shell
意思是通过shell来执行命令行
比如:
taskset -c 1-10 xtb --opt xxx.xyz
这条命令使用 os.system(),xtb运行时只占一个核(CPU1)
如果使用 subprocess.run(shell=True),xtb运行时占用1-10核
注意:
taskset -c 5-8
的时候,
会调用5,6,7,8四个核,两端都是闭区间

多线程模块 subprocess

https://www.jb51.net/article/142787.htm#_label3
上手教程,下面是 demo

import time
import subprocess

print(time.time())
res_1 = subprocess.Popen('echo 1; sleep 5', shell=True)
res_2 = subprocess.Popen('echo 1; sleep 10', shell=True)
res_1.wait()
print(time.time())
print(res_2.poll())
res_2.wait()
print(time.time())
print(res_2.poll())

f.readlines()

python 读取文件
如果一个文件是
--
1
--
f.readlines() 的长度是1
如果一个文件是
--
1

--
f.readlines() 的长度仍然是1
如果一个文件是
--
1

--
f.readlines() 的长度是2

return 报错

python 报错
this code is unreachable
原因:
一个函数最后有了 return,如果在 return 后面再加一句话,程序就不会执行这句话,因为前面都return,算是低级错误啦

find() 方法

str.find(str, beg=0, end=len(string))

使用字符串的 find 方法找到字符串中某字符的位置
如果找到,返回位置;若找不到,则返回 -1
https://www.runoob.com/python/att-string-find.html

round() 函数

python3.5的doc中,文档变成了“values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice.” 如果距离两边一样远,会保留到偶数的一边。比如round(0.5)和round(-0.5)都会保留到0,而round(1.5)会保留到2。
https://www.jb51.net/article/189084.htm

一个简单的方法实现如下功能:一组列表中,间隔在x以内的数据认为是同一组数据,如何去冗余呢?
使用round函数,比如说,认为间隔为0.3的数据为同一个数据,a=0.451,b=0.149, round(a/0.3)=2, round(b/0.3)=1,这样就可以把两个数据区分开来了。反之,如果二者间隔在0.3以内,除以0.3的商一致。

Typing

Optional类

Optional[X]等价于Union[X, None]
可选类型,作用几乎和带默认值的参数等价,不同的是使用Optional会告诉你的IDE或者框架:这个参数除了给定的默认值外还可以是None,而且使用有些静态检查工具如mypy时,对 a: int =None这样类似的声明可能会提示报错,但使用a :Optional[int] = None不会。
省流:IDE 能够更好识别 Optional[X] ,并给出提示。对于一些第三方工具,如 mypy ,更加安全。

List 类

from typing import List
https://blog.csdn.net/weixin_46713695/article/details/125032851
List是list的泛型,能够更精确的指定输入参数

networkx

使用networkx可以找到最大连通子图
https://blog.csdn.net/qq_35538296/article/details/122347528

随机抽样

如何用 random 模块进行随机抽样
https://www.cnblogs.com/skuld-yi/p/14583411.html

random.sample(population, k, *, counts=None)

返回序列中不重复的 k 个元素的列表,即无重复随机抽样
counts 可以将 population 中对应位扩充。增大相应比例。
此外,可重复抽样可以由

random.choices(population, weights=None, *, cum_weights=None, k=1)

更多有趣函数,请看:https://www.cnblogs.com/skuld-yi/p/14583411.html

pd.read_pickle

报错
AttributeError: Can’t get attribute ‘_unpickle_block’ on <module ‘pandas._libs.internals’ from ‘/home/mkliu/anaconda3/lib/python3.8/site-packages/pandas/_libs/internals.cpython-38-x86_64-linux-gnu.so’>
原因是换了一个环境,pandas 版本和 to_pickle 时的版本不一致,换回来即可

pandas

data=data.drop(range(20, 500)) #删除特定行
data = data[range(1, 11)] #索引特定列,不是很合法
data=data.drop('rel_e', axis=1) #删除特定列

axis=0, 1 分别对应行和列

ASE

一个 ASE 并行优化的脚本 (OC)

shutil.copy(opt_file)
subprocess.Popen('nohup taskset -c 1-10 python opt_file.py >>my.log 2>&1 &')
if idx % 5 == 0:

res_list = [None] * 2
res_list[0] = subprocess.Popen('echo 1; sleep 5', shell=True)
res_2 = subprocess.Popen('echo 1; sleep 10', shell=True)

核心思路是:
并行任务数N确定以后,初始化一个长度为N的None列表,同时开启N个子进程
将待优化文件提前准备好,和待优化分子文件一并放入新文件夹内,使用命令行Popen执行该优化文件
待优化文件内通过os.getcwd()感知分子构型,优化器、优化步数上限和力收敛判据通过直接修改待优化文件达到目的
大概是
os.path.exists()检查文件是否存在,如果不存在则新建优化文件(建议优化文件的名称为重要参数)
通过逐项检查res_list判断是否应补充新进程,建议适时插入time.sleep(1)
需要注意:
前提是所有构型优化成功,异常情况需要考虑异常捕获。(不然一个优化失败的构型会一直占着进程位)

flake8 初体验

python装上flake8以后
在项目目录下,对应python环境下,输flake8,可弹出代码不规范之处
.\src\autosteper\parser.py:90:89: E501 line too long (107 > 88 characters)
.\src\autosteper\parser.py:91:89: E501 line too long (113 > 88 characters)
相关设置在项目 setup.cfg 文件里
(我本来以为会自动帮忙规范代码,谁知道只是一个静态的提醒,仔细一想,好像也没办法动态改代码)

pytorch 零碎

PyTorch中MSELoss的使用

虽然MSE意思是均方根误差,但pytorch底层实现时,需要依赖reduction按钮调节最后用到的MSELoss。只有当reduction='mean’时,才是真正意义上的均方根误差

https://www.cnblogs.com/amazingter/p/14044236.html
reduction=‘none’:求所有对应位置的差的平方,返回的仍然是一个和原来形状一样的矩阵。

reduction=‘mean’:求所有对应位置差的平方的均值,返回的是一个标量。

reduction=‘sum’:求所有对应位置差的平方的和,返回的是一个标量。

CLR报错

https://blog.csdn.net/weixin_43002433/article/details/104969477
CyclicLR的参数cycle_momentum默认是True,优化器必须支持momentum,如果不支持的话,初次使用时会报错。

推理报错

https://blog.csdn.net/iamjingong/article/details/85308600
Attempting to deserialize object on CUDA device 1 but torch.cuda.device_count() is 1.
原来模型是两个gpu训练的,现在只用一个做推理,因此报错,加一个参数即可

model = torch.load(model_path, map_location='cuda:0')

python tips

A = {‘1’: 1} 是 dict
A = {‘1’: 1}, 是 turple
二者只差一个英文 ,


化学思考

形成能和结合能的辨析

http://muchong.com/html/200904/1294296.html
这两个概念很容易混淆
形成能,我的理解,是一个偏化学的概念,因为它与化学反应的焓变或内能变化有关,因为A(晶)+B(晶)=AB(晶),这里强调的是旧物质消失和新物质生成的化学反应,而状态是给定的,所以说是偏化学的。
结合能,我的理解,是一个偏物理的概念。虽然对于多原子晶体,这里面也有新旧物质的变化,但它更强调的是状态的变化。

单从能量区别上,结合能相当于这样一个过程的总能量变化:A(孤原)+B(孤原)=AB(晶体),可见它与形成能是有联系而又有区别的。
其中相差了这两个反应:A(孤原)=A(晶), B(孤原)=B(晶)

省流:
形成能计算时按照:
A(晶)+B(晶)=AB(晶)
或者
A(单质分子)+B(单质分子)=AB(新分子)
(强调新物质生成和旧物质的消失)
而结合能计算时:
A(孤原)+B(孤原)=AB(晶体)

MDS多维尺度分析

全称 multidimensional scaling,是一种降维算法
化学信息学中有 soap 等描述符来区别不同分子,或者作为神经网络输入进行能量预测。
随着分子体系的增加,这种描述符可能会存在维数爆炸的情况。
因此在进行聚类操作时可以使用 MDS 等降维工具降低计算量。
MDS 的优点在于,可以保持样本点在高维空间的距离不变。所以,只能在样本点数量较小时维持这一特性。

高斯关键词:xqc和qc

qc指,采用更容易收敛的线性搜索(远)+Newton-Raphson(近)
这种策略更容易收敛,可信度较高,但是速度比较慢
xqc指,第一次优化未收敛时,采用 qc 算法使其收敛,默认最大新增步数为32
yqc是新算法,更更更容易收敛。。。。

科研写作和绘图

typora

脚注在少数派的文章中也很常见,即某段话结尾右上角标有数字标记,页面底部进行注释的写法。你可以在需要插入脚注标号的位置写 [^ number ] ,再在下方通过 [^ number ]: 在文档中插入脚注。注意不要遗漏了脚注编号 number 前后的空格。
typora的脚注前后直接需要严格对应,有前就得有后,不然导出时不起效。
(如果前是ref,导出时会自动赋1)
https://sspai.com/post/54912
使用 typora 可以草拟论文草稿,脚注是一个快速替代参考文献的选择


typora 或 latex 里打angstrom
$\AA$
非斜体:
$\rm \AA$
latex 需要加上 siunitx


除了\angstrom命令,也可以使用\text{\AA}命令来表示Angstrom符号。这个命令不需要加载任何宏包,但需要保证文档的字体支持Angstrom符号。
请注意,\text{\AA}命令中的Å字符实际上是一个Unicode字符,所以可能在不同的文本编辑器和操作系统中显示略有不同。如果使用该命令,请确保输出的结果正确。

markdown实现页内跳转
https://blog.csdn.net/qq_40491534/article/details/123483784
依托 HTML 实现的


https://markdown.jianguoyun.com/2827.html
markdown里隐藏内容
<details><summary>title</summary>hided contents</details>
无法用小标题


科研论文时态选择

在这里插入图片描述

科研绘图

  1. python matplotlib 以 svg 格式保存文件
  2. PPT 进行 后处理
  3. 对该 PPT 进行备份
  4. 删除 PPT 中除待保存页外的其他所有页
  5. 调整 PPT 大小至刚好符合出版社要求为止
  6. 另存为 PDF 格式
  7. latex 引入

此外,直接从PPT导出svg会导致某些信息量过大的图失真。一种方法是先截图,再提高截图分辨率(在线网站等),最后将png格式转化为svg格式,最后再将svg格式转化为pdf格式
比较麻烦的是图片中字体的设定,使用 Arial 字体能够满足大部分出版社的要求。
方法1:
latex 打印特定字体。
\usepackage{fontspec}
\setmainfont{Arial}
然后 xelatex 编译
方法2:
matplotlib 打印特定字体
方法3:
第三方软件,比如妈咪叔开发的 https://www.latexlive.com/ 进行图片标题绘制

matplotlib

https://matplotlib.org/stable/gallery/lines_bars_and_markers/linestyles.html
使用 matplotlib linestyle 绘制折线图等


https://blog.csdn.net/nebula1008/article/details/116954695
改变matplotlib图例的大小和位置
图例位置的调整:
https://blog.csdn.net/Wannna/article/details/102751689

plt.legend(prop={'size': 4}, loc='lower right')

在这里插入图片描述


设置双y轴
https://www.cnblogs.com/Atanisi/p/8530693.html


https://blog.csdn.net/weixin_48419914/article/details/121672210
使用plt.xticks()改变x轴坐标,标签


https://blog.csdn.net/weixin_48435461/article/details/121182506
ax.text 或者 plt.xticks 中加一个参数 rotation 可以实现刻度的 旋转
默认是 degree


https://blog.csdn.net/A_Z666666/article/details/81165123
重要!!!!!!
Matplotlib,设置坐标刻度大小,字体/设置图例大小及字体/设置纵横坐标名称及字体及大小
文中脚本可以直接调用


https://blog.csdn.net/weixin_39591031/article/details/119902373
使用 tight_layout() 调整多子图的间距


seaborn

https://seaborn.pydata.org/tutorial/color_palettes.html
调配热图的颜色
seaborn 调色盘参数,as_cmap,意思是 as continuous mapping
因为Seaborn默认是6个离散的颜色,如果 as_cmap=True ,颜色会按照数值大小来
使用

cmap = sns.light_palette((260, 75, 60), input="husl", as_cmap=True)

可以调出漂亮的淡蓝色

latex

出版社格式要求

ACS

https://zhuanlan.zhihu.com/p/498031371
字体格式要求(无衬线字体)
Question: “Which font looks best in a scientific figure?”
Answer: “Arial or Helvetica, always.”
此外,acs要求字体不得小于5point,这个point是PPT字体的默认单位


图片格式要求:
ACS 图片要求单栏宽 8.255cm,双栏17.78cm
那么如何确定某一张图片的实际大小呢?
拖动图片到ppt,100%原视图下即为实际大小
可以画一条线测量
PPT里的统一单位是厘米
(matplotlib里的figsize默认单位是英寸)
在这里插入图片描述


TOC
宽 8.25cm 高 4.45cm


elsevier

https://blog.csdn.net/henielh/article/details/107233551
单栏图 8~9cm
双栏图 11.4~14cm
双栏图 17.1~19cm
最佳字体大小为8磅。
所有线条应该不小于0.25磅(0.99mm)
nature要求,elsevier没有明确要求。
TOC:宽 13cm 高 5cm

RSC

https://www.rsc.org/journals-books-databases/author-and-reviewer-hub/authors-information/prepare-and-format/figures-graphics-images/#chemicalstructures

单栏宽 8.3cm
双栏宽 17.1cm
高度低于 23.3cm

TOC
宽8cm
高4cm

字体族

https://blog.csdn.net/wangmeitingaa/article/details/88778183
常用的是:
\textrm{} :Roman Family 罗马字体
\textsf{}:Scan Serif Family 无衬线字体
\texttt{}:Typewriter Family 打字机字体
\textbf{}:字体加粗
\textit{}:斜体

bibtex报错

Undefined control sequence.
<write> …subitem}{@mcitecorrectmaxwidthsubitem
latex 报错
原因是 demo 的 bib file 里面没有引用,随机加上一条后即可正常使用

后分析:Undefined control sequence. 一般是未引用相关的包
前面加上 \usepackage{natbib} 即可


Package natbib Warning: There were undefined citations.
是因为没有加参考文献引用格式
https://blog.csdn.net/sinat_29760727/article/details/107963173
这个warning无关紧要,有的杂志不要求具体的bibstyle


换行

https://blog.csdn.net/DUTwangtaiyu/article/details/114281954
单纯换行:\
换行+缩进:\par
公式换行+对齐:\\ + & (&放在=前面)

表格

latex 表格入门
https://blog.csdn.net/m0_55746113/article/details/122783407


报错
Extra alignment tab has been changed to \cr,原因是:https://blog.csdn.net/qq_31225201/article/details/123988116,声明的列数和实际列数没有吻合


快速搞定表格:
方法1:
使用 typora 快速搭建表格,再另存为 latex
方法2:
使用在线网站 https://www.tablesgenerator.com/


https://zhuanlan.zhihu.com/p/337457317
使用 \resizebox{\linewidth}{!}{ 可以自动调整表格大小
也可以用 \begin{tabular}{p{1cm}|p{9cm}} 调节长宽


表格的标题是放在表格上方还是表格下方?由关键词 caption \begin{tabular} 决定
https://www.cnblogs.com/-yhwu/p/15591845.html
latex表格caption换位置


latexindent

https://blog.csdn.net/qq_27033267/article/details/109263626
使用 latexindent 自动规范 latex 文件

latexdiff

latexdiff old.tex new.tex >output.tex --exclude-textcmd=“section,subsection”
输出两个latex文件的差别

标题

https://zhuanlan.zhihu.com/p/464244924
一共七级标题
part、chapter、section、subsection、subsubsection、paragraph、subparagraph

图片

https://zhuanlan.zhihu.com/p/147952252?from_voters_page=true
解决图片过大的问题
[width=0.95\textwidth] 是0.95倍页宽


https://blog.csdn.net/xiaofalu/article/details/81274504
latex 绘图 [!htp] 参数的含义
简单说就是尽量放在图片代码出现的位置(!h)
如若无法放置,将顺延到下一页的顶部(t)
(p)表示允许图片放置在拥有一个浮动对象的页面里
其实还有(b)图片放置在下一页的底部
一般来说,单个一个 h 不一定起效,更常见的情况是 htbp 联用


波浪线

https://blog.csdn.net/robert_chen1988/article/details/78004436

  1. 数学模式下
    $\sim$
  2. 文字模式下
    \textasciitilde

然而,真正的波浪线在 latex 里不代表波浪线,只是强制空格的意思,是一种较老的用法。
https://blog.csdn.net/u012510648/article/details/106945857

latex tips

latex 里环境中加 * 表示不对公式或章节编号

\begin{equation*}
\end{equation*} % 不对公式编号
\section*{} % 不对章节编号

重要!!!!!!!!!!!!!!!!
vscode里,鼠标放在引入的包上面,会出现 documentation 的提示
点击即可看到对应包的文档


markdown 格式下的 公式复制粘贴到latex里不能用,可能是编码问题,但是用typora转成latex,再修改具体格式就又可以了


latex 交叉链接突然失效
重启电脑,重新编译
恢复正常。


小细节:句末引用参考文献时,\cite 放在句号前和句号后的效果是一样的


latex 里打出 et al,是套用拉丁模板
\latin{et al.}


查表之西班牙人名
https://blog.csdn.net/panbaoran913/article/details/126794955


SI 的小标题、图片、表格等需要在编号前加 S
使用 renew command 完成
https://www.stat.berkeley.edu/~paciorek/computingTips/Customizing_numbering_pages.html


windows

记事本快捷键

https://jingyan.baidu.com/article/295430f1f64ea00c7e00501f.html
简记:
ctrl + G 转到第几行
F3 = Ctrl + F 查找
Ctrl + H 替换
F5:在记事本直接记录显示当前系统时间
Ctrl+Home:回到页首,也就是记事本的第一行第一列
Ctrl+End:回到页尾,也就是记事本的最后一行最后一列
Home:光标移到行首
End:光标移到行尾
大部分都和常用快捷键一致

启动任务管理器

https://www.zhihu.com/question/500024314
右键点击 win 图标
CTRL + Shift + Esc 也可以
比较酷的办法是命令行启动,win+R, 然后 taskmgr

修改文件默认打开方式

https://jingyan.baidu.com/article/54b6b9c03ca74b6c583b47ab.html
方法1:
右键点击,再按照引导进行修改。
但是这种方法不一定有效,此时用方法2:
删除userchoices,在openwithlist里面把其余不相关的删掉,修改default值为默认程序

其他

统计学三大系数

https://zhuanlan.zhihu.com/p/34717666
Pearson积差相关系数:用于量度两个变量X和Y之间的线性相关。
Spearman秩相关系数:使利用两变量的秩次大小作线性相关分析。
Kendall秩相关系数: 用于反映分类变量相关性的指标。
1000个异构体,xtb算和dft算,得出1000个浮点数能量。
Pearson 是这1000个能量间的相关性
Spearman 是1000个能量的排序的相关性
1000个人,按肥瘦分10组,按收入分8组
收入和肥瘦间的相关性用Kendall衡量(似乎是这样,有空再深入研究)

docker

https://blog.csdn.net/gf19960103/article/details/109489632
Docker容器化安装Python、第三方包、制作镜像、内网部署
重要文章!!!!!!!!


https://blog.csdn.net/u013641234/article/details/88770647
解决 imagePulloff 的报错,可以在yaml里加上image pull policy

搜索路径

https://blog.csdn.net/cnds123/article/details/101546889
终端里找到python site-packages的路径


在搜索路径的表头添加一个空的字符串,即可实现索引同级、下级目录里的module,前提是有 __init__.py 文件
在这里插入图片描述


pycharm

退出vim光标模式

按一下insert键即可

退出命令行状态

打开pycharm终端的时候处于命令行状态
conda activate 不起作用
提升显示换成 CALL conda.bat activate xxx 即可
(也可以试一下 conda activate dflow

另一种方法是先换成base环境 (conda init) ,然后再开一个新的shell,此时自动就是base环境下的终端了

tips

  1. 首次配置conda的时候不要挂vpn
  2. formular是公式的,形容词。formula是公式,名词。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值