2013-10-14 6 views
2

У меня есть необработанные данные, такие как ниже. например, Мы загружаем текстовый файл, который имеет 1-ю строку, имеет xlabel, 1-й столбец - иглабель. имя вызываемого файла - «131014-data-xy-conv-1.txt».Как манипулировать данными после numpy.loadtxt?

Y/X (mm), 0, 10, 20, 30, 40 
686.6, -5.02, -0.417, 0, 100.627, 0 
694.08, -5.02, -4.529, -17.731, -5.309, -3.535 
701.56, 1.869, -4.529, -17.731, -5.309, -3.535 
709.04, 1.869, -4.689, -17.667, -5.704, -3.482 
716.52, 4.572, -4.689, -17.186, -5.704, -2.51 
724, 4.572, -4.486, -17.186, -5.138, -2.51 
731.48, 6.323, -4.486, -16.396, -5.138, -1.933 
738.96, 6.323, -4.977, -16.396, -5.319, -1.933 
746.44, 7.007, -4.251, -16.577, -5.319, -1.688 
753.92, 7.007, -4.251, -16.577, -5.618, -1.688 
761.4, 7.338, -3.514, -16.78, -5.618, -1.207 
768.88, 7.338, -3.514, -16.78, -4.657, -1.207 
776.36, 7.263, -3.877, -15.99, -4.657, -0.822 

(Q1) Как вы можете видеть необработанные данные, они есть xlabel и ylabel в соответственно 1 ряд, 1-й столбец. Если я использую функцию numpy.loadtxt, как разделить «xs» и «ys»?

rawdata = numpy.loadtxt('131014-data-xy-conv-1.txt') 
xs, ys, data = func(rawdata) 

Должен ли я реализовать дополнительную логику? или есть какая-либо функция?

ответ

5

На самом деле, np.loadtxt не может справиться с этой первой строки по отдельности очень хорошо, так что вы должны сделать что-то умная. Я дам два пути, первый короче, но второе более straighforward

1) вы могли бы сделать это «рубить», прочитав первую строку в качестве заголовка имен:

y_and_data = np.genfromtxt('131014-data-xy-conv-1.txt', names=True, delimiter=',') 
x = np.array(y_and_data.dtype.names[1:], int) 
y = y_and_data['YX_mm'] 
data = y_and_data.view(np.float).reshape(-1, len(y_and_data.dtype))[:,1:] 

2) Но я рекомендую просто прочитать первую строку отдельно первым, сохраните его, а затем откройте остальные с loadtxt (или genfromtxt, как я использовал и рекомендую):

with open('131014-data-xy-conv-1.txt', 'r') as f: 
    x = np.array(f.readline().split(',')[1:], int) 
    y_and_data = np.genfromtxt(f, delimiter=',') 
y = y_and_data[:,0] 
data = y_and_data[:,1:] 

Как это работает, сначала откройте файл , и назовите его f:

with open('131014-data-xy-conv-1.txt', 'r') as f: 

    firstline = f.readline()   # read off the first line 
    firstvalues = firstline.split(',') # split it on the comma 
    xvalues = firstvalues[1:]   # and keep the all but the first elements 
    x = np.array(xvalues, int)   # make it an array of integers (or float if you prefer) 

Теперь, когда первая линия была считана с f использованием f.readline, остальные могут быть считаны с genfromtxt:

y_and_data = np.genfromtxt(f, delimiter=',') 

Теперь другие ответы показывают, как разделить остальное:

y = y_and_data[:,0]  # the first column is the y-values 
data = y_and_data[:,1:] # the remaining columns are the data 

И это выход:

In [58]: with open('131014-data-xy-conv-1.txt', 'r') as f: 
    ....:  x = np.array(f.readline().split(',')[1:], int) 
    ....:  y_and_data = np.genfromtxt(f, delimiter=',') 
    ....: y = y_and_data[:,0] 
    ....: data = y_and_data[:,1:] 
    ....: 

In [59]: x 
Out[59]: array([ 0, 10, 20, 30, 40]) 

In [60]: y 
Out[60]: 
array([ 686.6 , 694.08, 701.56, 709.04, 716.52, 724. , 731.48, 
     738.96, 746.44, 753.92, 761.4 , 768.88, 776.36]) 

In [61]: data 
Out[61]: 
array([[ -5.02 , -0.417, 0. , 100.627, 0. ], 
     [ -5.02 , -4.529, -17.731, -5.309, -3.535], 
     [ 1.869, -4.529, -17.731, -5.309, -3.535], 
     [ 1.869, -4.689, -17.667, -5.704, -3.482], 
     [ 4.572, -4.689, -17.186, -5.704, -2.51 ], 
     [ 4.572, -4.486, -17.186, -5.138, -2.51 ], 
     [ 6.323, -4.486, -16.396, -5.138, -1.933], 
     [ 6.323, -4.977, -16.396, -5.319, -1.933], 
     [ 7.007, -4.251, -16.577, -5.319, -1.688], 
     [ 7.007, -4.251, -16.577, -5.618, -1.688], 
     [ 7.338, -3.514, -16.78 , -5.618, -1.207], 
     [ 7.338, -3.514, -16.78 , -4.657, -1.207], 
     [ 7.263, -3.877, -15.99 , -4.657, -0.822]]) 
1

Если вы просто хотите xs, ys и data в отдельные массивы, вы можете сделать это:

xs = np.array(open('131014-data-xy-conv-1.txt').readline().split(',')[1:], int) 
rawdata = numpy.loadtxt('131014-data-xy-conv-1.txt', skiprows=1) 
ys = rawdata[:, 0] 
data = rawdata[:, 1:] 

Обратите внимание на ключевое слово skiprows игнорировать первую строку файла.

+1

Я не думаю, что это формат, который имеет OP. Второй столбец не содержит данных Y, он содержит первую иглавую, а затем данные. – DSM

+0

Вы не можете пропустить первую строку, она имеет x-данные. – askewchan

+0

Спасибо. Ответ обновлен. – bogatron

1

Добавление к @ bogatron отвечают, вы можете передать аргумент unpack=True получить xs, ys, data в одной строке:

xs, ys, data = numpy.loadtxt('131014-data-xy-conv-1.txt', skiprows=1, unpack=True) 
Смежные вопросы