【问题标题】:Splitting data file columns into separate arrays in Python在 Python 中将数据文件列拆分为单独的数组
【发布时间】:2013-04-18 05:22:35
【问题描述】:

我是 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

但显然它是完全错误的。谁能给我一个简单的答案,并解释这些线条的确切含义会有所帮助。干杯。

编辑:前两行在整个文件中重复。

【问题讨论】:

    标签: python


    【解决方案1】:

    这是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)]
    

    【讨论】:

    • splat 运算符不是zip 函数的一部分...否则,很好的解决方案。
    • 这不起作用:.split() 是一个字符串方法,而lines 是一个字符串列表。你需要Xvals, Yvals = zip(*(line.split() for line in lines)) 什么的。
    • 我得到一个与“Xvals, Yvals = zip(*(lines.split())” 行有关的无效语法错误。如果有任何改变,我正在使用 python 3.2。
    【解决方案2】:

    一种方法是:

    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 函数的调用,它会将您从文件中获取的字符串更改为数字。

    【讨论】:

    • 第一行出现错误“ValueError: need more than 0 values to unpack” (Xvals=[], Yvals=[])
    • 对不起:第一行应该是Xvals=[]; Yvals=[](或两个单独的行)
    • 另一个错误“ValueError: need more than 1 value to unpack” ...也许我做错了什么?
    【解决方案3】:

    这就是 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

    【讨论】:

    • 抱歉,我编辑了我的问题,时间步长信息也出现在文件的后面,所以这不会运行,因为它会在遇到浮点数到字符串转换错误时抛出错误。
    【解决方案4】:

    如果你想用 matplotlib 绘制这个文件,你可能想看看它的 plotfile 函数。见官方文档here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-17
      • 2022-10-13
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      相关资源
      最近更新 更多