我想从.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
答案 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]])