小言_互联网的博客

奇技淫巧第7期

345人阅读  评论(0)

终于腾出时间了,现在对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


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是公式,名词。

转载:https://blog.csdn.net/frank_haha/article/details/127894760
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场