用不同的字符串分隔数组

时间:2018-04-27 15:05:56

标签: python-3.x numpy delimiter-separated-values

我有一个文本文件,其中包含3列有用数据,我希望能够使用numpy在python中提取这些数据。文件类型为* .nc, NOT 为netCDF4文件类型。它是CNC机床的标准文件输出类型。在我的例子中,它是一种CMM(坐标测量机)。格式如下:

X0.8523542Y0.0000000Z0.5312869

X,Y和Z是机器上的坐标轴。我的问题是,我可以用多个分隔符分隔数组吗?在这种情况下:" X"," Y"和" Z"。

3 个答案:

答案 0 :(得分:1)

您可以使用Pandas

import pandas as pd
from io import StringIO

#Create a mock file
ncfile = StringIO("""X0.8523542Y0.0000000Z0.5312869
X0.7523542Y1.0000000Z0.5312869
X0.6523542Y2.0000000Z0.5312869
X0.5523542Y3.0000000Z0.5312869""")

df  = pd.read_csv(ncfile,header=None)

#Use regex with split to define delimiters as X, Y, Z.
df_out = df[0].str.split(r'X|Y|Z', expand=True)

df_out.set_axis(['index','X','Y','Z'], axis=1, inplace=False)

输出:

  index          X          Y          Z
0        0.8523542  0.0000000  0.5312869
1        0.7523542  1.0000000  0.5312869
2        0.6523542  2.0000000  0.5312869
3        0.5523542  3.0000000  0.5312869

答案 1 :(得分:0)

我最终使用了Scott提供的Pandas解决方案。由于某种原因,我不是100%明确,我不能简单地将数组从字符串转换为浮点数与浮点数(数组)。我创建了一个大小相等的数组,并迭代了数组的大小,将每个单独的元素转换为float并将其保存到另一个数组。

全部谢谢

答案 2 :(得分:0)

使用我在评论中建议的过滤功能:

字符串示例(替代文件):

In [1]: txt = '''X0.8523542Y0.0000000Z0.5312869
   ...: X0.8523542Y0.0000000Z0.5312869
   ...: X0.8523542Y0.0000000Z0.5312869
   ...: X0.8523542Y0.0000000Z0.5312869'''

基本genfromtxt使用 - 获取字符串:

In [3]: np.genfromtxt(txt.splitlines(), dtype=None,encoding=None)
Out[3]: 
array(['X0.8523542Y0.0000000Z0.5312869', 'X0.8523542Y0.0000000Z0.5312869',
       'X0.8523542Y0.0000000Z0.5312869', 'X0.8523542Y0.0000000Z0.5312869'],
      dtype='<U30')

这个字符串数组可以与pandas答案一样精神分割。

定义一个函数来替换一行中的分隔符:

In [6]: def foo(aline):
   ...:     return aline.replace('X','').replace('Y',',').replace('Z',',')

re可用于更漂亮的拆分。

测试它:

In [7]: foo('X0.8523542Y0.0000000Z0.5312869')
Out[7]: '0.8523542,0.0000000,0.5312869'

genfromtxt

中使用它
In [9]: np.genfromtxt((foo(aline) for aline in txt.splitlines()), dtype=float,delimiter=',')
Out[9]: 
array([[0.8523542, 0.       , 0.5312869],
       [0.8523542, 0.       , 0.5312869],
       [0.8523542, 0.       , 0.5312869],
       [0.8523542, 0.       , 0.5312869]])

使用文件,生成器会像:

(foo(aline) for aline in open(afile))