• 奇技淫巧第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())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    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))
    
    • 1

    使用字符串的 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)
    
    • 1

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

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

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

    pd.read_pickle

    报错
    AttributeError: Can’t get attribute ‘_unpickle_block’ on
    原因是换了一个环境,pandas 版本和 to_pickle 时的版本不一致,换回来即可

    pandas

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

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    核心思路是:
    并行任务数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')
    
    • 1

    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里隐藏内容

    titlehided contents

    无法用小标题


    科研论文时态选择

    在这里插入图片描述

    科研绘图

    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')
    
    • 1

    在这里插入图片描述


    设置双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)
    
    • 1

    可以调出漂亮的淡蓝色

    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.
    …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*{} % 不对章节编号
    
    • 1
    • 2
    • 3

    重要!!!!!!!!!!!!!!!!
    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是公式,名词。
  • 相关阅读:
    stm32的ADC采样率如何通过Time定时器进行控制
    【Leetcode HOT100】不同路径 c++
    易基因|表观发育:ChIP-seq揭示精子H3K4me3可传递到胚胎并与代谢功能障碍遗传有关
    365天挑战LeetCode1000题——Day 055 用户分组
    redis与Java交互
    第十三届蓝桥杯大赛软件赛省赛CC++大学B组
    kubeadm 安装k8s
    多输入多输出 | MATLAB实现PSO-BP粒子群优化BP神经网络多输入多输出
    安装Mysql报错:Could not create or access the registry key needed for the...
    Pytorch多GPU并行训练: DistributedDataParallel
  • 原文地址:https://blog.csdn.net/frank_haha/article/details/127894760