Разграничить массив с разными строками - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть текстовый файл, который содержит 3 столбца полезных данных, которые я хотел бы извлечь из python, используя numpy. Тип файла * .nc и НЕ тип файла netCDF4. Это стандартный тип вывода файла для станков с ЧПУ. В моем случае это своего рода CMM (координатно-измерительная машина). Формат выглядит примерно так:

X0.8523542Y0.0000000Z0.5312869

X, Y и Z - это координатные оси на станке. У меня вопрос, могу ли я разделить массив с несколькими разделителями? В данном случае: «X», «Y» и «Z».

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

В итоге я использовал решение Pandas, предоставленное Скоттом. По какой-то причине я не уверен на 100%, я не могу просто преобразовать массив из строки в float с помощью float (array). Я создал массив одинакового размера и прошел итерацию по размеру массива, преобразовав каждый отдельный элемент в число с плавающей точкой и сохранив его в другом массиве.

Спасибо всем

0 голосов
/ 28 апреля 2018

Используя функцию фильтра, которую я предложил в комментарии:

Образец строки (standin для файла):

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))
0 голосов
/ 27 апреля 2018

Вы можете использовать Панд

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
...