在numpy中快速读取较少的结构ascii数据文件

时间:2014-03-04 15:14:17

标签: python numpy io

我想从.xsf文件中读取数据网格(浮点数的3D数组)。 (格式文档在这里http://www.xcrysden.org/doc/XSF.html BEGIN_BLOCK_DATAGRID_3D块)

问题是数据在5列中,如果元素数Nx * Ny * Nz不能被<5>整除,那么最后一行可以有任何长度。 出于这个原因,我无法使用numpy.loadtxt() 的 numpy.genfromtxt() 。 ..

我做了一个子程序,确实解决了这个问题,但速度非常慢(因为它可能使用了紧密的循环)。我想要阅读的文件很大(> 200 MB 200x200x200 = 800,000个ASCII码)

有没有非常快的方法如何在python / numpy中读取这种不友好的格式到ndarray?


xsf datagrids看起来像这样(shape =(3,3,3)的例子)

BEGIN_BLOCK_DATAGRID_3D
 BEGIN_DATAGRID_3D_this_is_3Dgrid          
 3  3  3         # number of elements Nx Ny Nz                     
 0.0 0.0 0.0     # grid origin in real space                     
 1.0 0.0 0.0     # grid size in real space                    
 0.0 1.0 0.0                               
 0.0 0.0 1.0                          
   0.000  1.000  2.000  5.196  8.000   # data in 5 columns     
   1.000  1.414  2.236  5.292  8.062        
   2.000  2.236  2.828  5.568  8.246        
   3.000  3.162  3.606  6.000  8.544        
   4.000  4.123  4.472  6.557  8.944                   
   1.000  1.414                       # this is the problem
  END_DATAGRID_3D                      
 END_BLOCK_DATAGRID_3D                   

1 个答案:

答案 0 :(得分:0)

我得到了与熊猫和Numpy合作的东西。熊猫将填写缺失数据的纳米值。

import pandas as pd
import numpy as np
df = pd.read_csv("xyz.data", header=None, delimiter=r'\s+', dtype=np.float, skiprows=7, skipfooter=2)
data = df.values.flatten()
data = data[~np.isnan(data)]
result = data.reshape((data.size/3, 3))

输出

>>> result
array([[ 0.   ,  1.   ,  2.   ],
       [ 5.196,  8.   ,  1.   ],
       [ 1.414,  2.236,  5.292],
       [ 8.062,  2.   ,  2.236],
       [ 2.828,  5.568,  8.246],
       [ 3.   ,  3.162,  3.606],
       [ 6.   ,  8.544,  4.   ],
       [ 4.123,  4.472,  6.557],
       [ 8.944,  1.   ,  1.414]])