1. 用 Python 简化数据处理流程的 workflow 及简单示范

    注:本文所述方法肯定不是最简单的,但对我这非编程相关专业的人来说已经提高很多效率了。如果你有更好的办法,欢迎留言。

    如果同样的一个程序,改变一系列参数,分别计算结果,我一般选择把这个程序复制很多份,放在不同的文件夹里,然后写几个批处理文件(写几个是为了能同时几个一起算),按一定的次序分别执行它们,并把结果保存的相应的目录。保存的结果有很多时候是逗号分隔的csv文件,这时候如果想作图的话,就需要从每个文件中拷出数据来,然后复制到 Origin 中进行绘图。

    这样的 workflow 在对付我之前面对的多数问题都 ok,但如果保存的数据量大了,尤其是每一个 csv 文件中的列数多了(比如10列以上),或者 copy 出来的数据需要进行修改、筛选等复杂操作时,就显得有些繁琐和吃力了。相比之下,用 Python 来读取数据,并进行后续的处理和绘图就会简单一些,并且有更好的一致性。

    举例来说,比如按不同的参数,跑了10组结果,分别存在 param1~param10的文件夹中,每个文件夹中都有 result.txt 的文件 …

    read more
  2. 用Cython来加速Python的科学计算程序

    从网上照抄的一些 LBM 算例基本都是在规整的矩形区域内的计算,用简单的 Numpy 非常适合,但当需要计算一些稍微更复杂的计算域时,纯 Numpy 的计算逻辑就有点复杂了,这时最简单的办法还是循环计算节点,这时候就不得不请出 Cython 了。

    对我这种级别的人来说,Cython 基本上可以理解成用 Python 的语法来写 C,与 Python 的主要区别在于可以定义变量的类型,以及需要编译成 Python 库才能运行。这篇文章简单记录一下使用 Cython 的一些入门知识。

    使用 Cython,先需要建立一个 pyx 格式的源文件,以计算宏观密度的函数为例,建立 rho.pyx 文件,并写入如下的函数:

    def calc_rho_notype(f):  
        rho = np.empty_like(f[:,:,0])  
        for i …
    read more
  3. 把 python 科学计算环境换成了 Anaconda

    此前尝试过 python(x,y),但最终还是换回了纯 python 的环境,一方面是因为它太大,另一方面它实在包含了太多不可控的东西,包括潜在的污染系统 python 的危险等。偶然看到 Anaconda 的介绍,似乎是一种较为「绿色」的方案,而且带的科学计算包也比较全,试着装了一下,确实不错。Anaconda 的一个主要优势在于,它集成了绝大部分常用的计算包,并全部放在自己的文件夹中,与系统内已安装的 Python 相对独立,因此安装下来非常干净。如果其它人也想运行在这个环境下写出来的代码,只需要安装 Anaconda 环境即可,而不再需要一个一个把需要的包都下载下来,这一点,在与其它人交流代码时就太方便了。

    从原来配置的环境换到 Anaconda 也非常简单,大概会有这么几个问题:

    1. 删除重复的包,如 numpy / scipy / matplotlib 等,用 pip uninstall 即可 …

    read more
  4. Python 输出用于 Paraview 后处理的 vtk 文件

    好拗口的标题。。。

    前面的博客中已经提到,Python 有 Matplotlib 这种强大的包可以「在线」地生成(并保存)漂亮的图形,但对于计算流体力学的后处理来说,很多时候需要更多「事后」的后处理。在线的即时输出,虽然可以快速预览结果,但对于想输出什么结果必须在写程序阶段就全部想明白,而不是先计算完,按一定间隔输出整个流场的信息,然后后期想要什么数据慢慢提取分析就行。

    解决这个问题的方法也很简单,直接照抄开源 LBM 软件 Palabos 的方案,用 vtk 格式保存流场信息,然后用 Paraview 进行后处理。

    这个「十分简单」的技术路线结果却花了我很多天的时间,才基本搞清楚其中的奥秘,从多个 tricky part 中脱身。技术上来说,Python 输出 vtk 有成熟的软件包(我采用的是pyevtk 这个库[1]),实现方法也比较直观。例如官方提供的一个示例是这样的 …

    read more
  5. 用 numexpr 库优化 numpy 计算速度

    NumPy 虽然通过底层高度优化过的计算库可以实现接近C的高效计算,但在计算复杂且计算量庞大的时候多少还是有些嫌慢。Numexpr 库是最近发现的一个非常简单易用的 Numpy性能提升工具,很大程度上从我的需求上解决了性能的问题。

    先看一个例子:

    import numpy as np
    import numexpr as ne
    nx, ny = 1200, 1500
    a = np.linspace(0.,3.1416,nx*ny).reshape(nx,ny)
    for i in range(100):
        b = np.sin(a+i)**2 + np.cos(a+i)**2 + a**1.5 …
    read more
  6. 关于 Numpy 数组作为函数参数的一个小问题

    注:本文的所写的只是我自己想出来的一个办法,很可能不是最优或者最标准的做法,如果有高手看到,欢迎指正!

    在计算过程中遇到这样的一个问题,需要对一个 nx*ny 的网格上每一个节点调用一次函数,然后返回一个 nx*ny 的数组。

    我之前就写过类似的程序,numpy 可以直接调用普通的计算程序,比如:

    def x_square(x):
        return x*x
    a = np.arange(nx*ny).reshape(nx,ny)
    print x_square(a)

    直接把 ndarray 对象作为参数传入函数,就可以得到一个正确的结果。

    于是,想当然地,也针对上面的需求,写了这样一个程序:

    ff = np.linspace(1.0,2.0 …
    read more

« Page 2 / 3 »

links

social