Python 杂集


1. 调试print一行 小技巧

调试的时候经常需要打印进度,例如

for i in range(10000):
    if i%100 == 0:
        print(i)
    # 而这里以上两行可以缩减为一行,即
    print(i) if i%100==0 else None 
    # 这里的None也可以替换为其他不发生实际作用的值,比如一个数字,一个字符等。

2. scipy空间计算模块scipy.spatial

计算多个粒子围成空腔的体积,可以用scipy.spatial.ConvexHull来计算(官网说明)

3. scipy.special 关于排列组合和阶乘

from scipy.special import perm, comb, factorial
perm(5,2) # output: 20.0
comb(5,2) # output: 10.0
factorial(5) # output: array(120.0)

4. python/shell交互

4.1. shell -> python 获取shell输出

在python中执行shell命令并获取其输出的方法是使用subprocess的checkoutput

import subprocess as sb
 fname = sb.check_output('ls msd*', shell=True).strip().decode('utf-8').split('\n') # 这里output直接返回的是一个字节字符串,decode解一下即可

4.2. python -> shell 子shell获取python的变量

4.2.1. 把python变量做成系统变量

import os
var=123或var='123'
os.environ['var']=str(var)
os.system('echo $var')

4.2.2. 字符串连接

import os
path=’/root/a.txt’
var=[1]
var='bash'
os.system('echo ’ + path)
os.system('echo ‘ + str(var[0]))
os.system(’echo ’ + var + ’ /root/c.sh’)

5.2. numpy数组的拼接

np.c_ 可以将多个一维的数组按列拼接

 np.c_[np.array([1,2,3]), np.array([4,5,6])]
Out[96]: 
array([[1, 4],
       [2, 5],
       [3, 6]])

6.2. python生成随机多维数组

import numpy as np
a = np.random.random((3, 3))

7.2. numpy库ndarray多维数组的维度变换方法:reshape、resize、swapaxes、flatten

  • .reshape 不改变数组元素,返回一个shape形状的数组,原数组不变
  • .resize(shape) : 与.reshape()功能一致,但修改原数组
    note: 修改维度这两个能满足大部分的情况
  • .flatten() 对数组进行降维,返回折叠后的一维数组,原数组不变
  • swapaxes(ax1,ax2) : 将数组n个维度中两个维度进行调换,不改变原数组
    对于矩阵操作有时候需要旋转维度,二维转置直接.T较为简单,如果是高维的话,需要借助numpy.swapaxes函数。
>>> a = np.array([[1, 2, 3], [4, 5, 6]])
>>> a
array([[1, 2, 3],
       [4, 5, 6]])
>>> a.shape
(2, 3)

# 注意:python的维度是从0开始的,也就是二维是0维和1维
# a.swapaxes(0, 1) 等价于 np.swapaxes(a, 0, 1)
>>> a.swapaxes(0, 1)
array([[1, 4],
       [2, 5],
       [3, 6]])
>>> a.swapaxes(0, 1).shape
(3, 2)
# 由于是二维矩阵,可以使用.T操作
>>> a.T.shape
(3, 2)
下面使用的numpy.tile(官方文档)函数可以看另一篇博客numpy.tile 示例

# 高维示例
>>> c = np.tile(a, (2, 4, 2))
>>> c
array([[[1, 2, 3, 1, 2, 3],
        [4, 5, 6, 4, 5, 6],
        [1, 2, 3, 1, 2, 3],
        [4, 5, 6, 4, 5, 6],
        [1, 2, 3, 1, 2, 3],
        [4, 5, 6, 4, 5, 6],
        [1, 2, 3, 1, 2, 3],
        [4, 5, 6, 4, 5, 6]],

       [[1, 2, 3, 1, 2, 3],
        [4, 5, 6, 4, 5, 6],
        [1, 2, 3, 1, 2, 3],
        [4, 5, 6, 4, 5, 6],
        [1, 2, 3, 1, 2, 3],
        [4, 5, 6, 4, 5, 6],
        [1, 2, 3, 1, 2, 3],
        [4, 5, 6, 4, 5, 6]]])
>>> c.shape
(2, 8, 6)
>>> c.swapaxes(0, 1)
array([[[1, 2, 3, 1, 2, 3],
        [1, 2, 3, 1, 2, 3]],

       [[4, 5, 6, 4, 5, 6],
        [4, 5, 6, 4, 5, 6]],

       [[1, 2, 3, 1, 2, 3],
        [1, 2, 3, 1, 2, 3]],

       [[4, 5, 6, 4, 5, 6],
        [4, 5, 6, 4, 5, 6]],

       [[1, 2, 3, 1, 2, 3],
        [1, 2, 3, 1, 2, 3]],

       [[4, 5, 6, 4, 5, 6],
        [4, 5, 6, 4, 5, 6]],

       [[1, 2, 3, 1, 2, 3],
        [1, 2, 3, 1, 2, 3]],

       [[4, 5, 6, 4, 5, 6],
        [4, 5, 6, 4, 5, 6]]])
>>> c.swapaxes(0, 1).shape
(8, 2, 6)
# 可以看到0维和1维进行了交换

8.2. 有关python字典

8.3. 字典的初始化

  1. 通过字典推导式创建
     >>> dic = {i:[] for i in range(3)}
     >>> dic
     {0: [], 1: [], 2: []
    
  2. dict和zip的结合
     >>> dic = dict(zip(["atom",'bond','angle'],[1,2,3]))
     >>> dic
     'angle': 3, 'atom': 1, 'bond': 2}
    

    8.4. 字典的方法

    d.items()和d.iteritems()     #items返回字典key-value的列表,iteritems返回所有key-value的迭代器  
    d.keys()和d.iterkeys()       #keys返回字典key的列表,iterkeys返回字典key的迭代器  
    d.values()和d.itervalues()   #values返回字典中所有value的列表,itervalues()返回字典中所有的value的迭代器
    

    8.5. 字典排序

    根据需要可以根据“键”或“键值”进行不同顺序的排序
    函数原型sorted(dic,value,reverse)
    dic为比较函数,value 为排序的对象(这里指键或键值),reverse:注明升序还是降序,True–降序,False–升序(默认)
    案例
    dic = {'a':3 , 'b':2 , 'c': 1}
    注意: 排序之后原字典没有变,顺序依旧
    
    a=sorted(d.iteritems(),key=lambda asd:asd[0],reverse=False)
    #在函数中,第一个参数传给第二个参数“键-键值”,第二个参数取出其中的键([0])或键值(1])
    
    Note: 其中asd:asd[0]中的asd可以是其他类型,如class instance,然后asd.tag作为排序值。所以从这里可以看出asd就是元组化后的字典元组对,第一个值是key, 第二个值是value,排序可以是有asd导出的任何可排序值。

9. python读取文件-pandas

from pandas import read_csv
data = read_csv("file.xv", delim_whitesapce=True, header=None).values

10. pandas的使用

10.1. pandas 读取数据文件

from pandas import read_csv, read_table
data = read_csv('./1us.lxyz', delim_whitespace=True, header=None).values.reshape(-1, 2401, 3)
#read_csv读取得到的数据是二维numpy数组
data = read_table('./1us.lxyz').values.reshape(-1, 2401, 3)

测试条件: E5-2630 v3 @ 2.40GHz, 1us.lxyz数据文件1.4G。如果用numpy.loadtxt('./1us.lxyz')则需要11分钟左右。