Разделение столбцов файла данных на отдельные массивы в Python - PullRequest
3 голосов
/ 27 февраля 2012

Я новичок в python и пытаюсь понять это весь день. У меня есть файл данных, выложенный как показано ниже,

time    I(R_stkb)

Step Information: Temp=0  (Run: 1/11)

0.000000000000000e+000  0.000000e+000

9.999999960041972e-012  8.924141e-012

1.999999992008394e-011  9.623148e-012

3.999999984016789e-011  6.154220e-012

(Примечание: между каждой строкой данных нет пустой строки.)

Я хочу построить данные с помощью функций matplotlib, поэтому мне понадобятся два отдельных столбца в массивах.

У меня сейчас есть

def plotdata():

Xvals=[], Yvals=[]
i = open(file,'r')

for line in i:
    Xvals,Yvals = line.split(' ', 1)

print Xvals,Yvals

Но, очевидно, это совершенно неправильно. Может ли кто-нибудь дать мне простой ответ на это, и с объяснением того, что именно означают строки, было бы полезно. Приветствия.

Редактировать: первые две строки повторяются по всему файлу.

Ответы [ 4 ]

5 голосов
/ 27 февраля 2012

Это задание для оператора * в методе zip.

>>> asdf
[[1, 2], [3, 4], [5, 6]]


>>> zip(*asdf)
[(1, 3, 5), (2, 4, 6)]

Так что в контексте ваших данных это может быть что-то вроде:

handle = open(file,'r')
lines = [line.split() for line in handle if line[:4] not in ('time', 'Step')]
Xvals, Yvals = zip(*lines)

или если вам действительно необходимо иметь возможность впоследствии изменять данные, вы можете просто вызвать конструктор list для каждого кортежа:

Xvals, Yvals = [list(block) for block in zip(*lines)]
2 голосов
/ 27 февраля 2012

Один из способов сделать это:

Xvals=[]; Yvals=[]
i = open(file,'r')

for line in i:
    x, y = line.split(' ', 1)
    Xvals.append(float(x))
    Yvals.append(float(y))

print Xvals,Yvals

Обратите внимание на вызов функции float, которая изменит строку, полученную из файла, на число.

1 голос
/ 27 февраля 2012

Это то, для чего предназначен numpy.loadtxt.Попробуйте:

import numpy as np
import matplotlib.pyplot as plt

data = np.loadtxt(file, skiprows = 2) # assuming you have time and step information on 2 separate lines 
                                      # and you do not want to read them
plt.plot(data[:,0], data[:,1])
plt.show()

РЕДАКТИРОВАТЬ: если у вас есть информация о времени и шагах, разбросанных по файлу, и вы хотите нанести данные на каждом шаге, есть возможность чтения всего файла в память (предположим, он достаточно мал), а затем разбить его на строки time:

l = open(fname, 'rb').read()
for chunk in l.split('time'):
    data = np.array([s.split() for s in chunk.split('\n')[2:]][:-1], dtype = np.float)
    plt.plot(data[:,0], data[:,1])
    plt.show()

В противном случае можно добавить знак комментария # к строкам комментария и использовать np.loadxt.

0 голосов
/ 18 апреля 2013

Если вы хотите построить этот файл с помощью matplotlib, вы можете проверить его функцию plotfile. Смотри официальную документацию здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...