我有一个制表符分隔值的文件,其中文件的前半部分具有3列和N行,后半部分具有2列和M行。我需要将这样的文件转换为两个单独的数组:3xN和2xM。

例子:

   6.7900209022264466       -3.8259897286289504        13.563976248832137
   1.5334543760683907        12.723711617874176        1.5148291755004299
   2.4282763900233522        9.1305022788201136       -3.1003673775485394
  -6.5344717544805586E-002  -12.487743380186622        2.6928902187606480
   8.9067951331740804        13.403331728374390      -0.58045132774289632
  -11.842481592786449       -5.7083783211328551        1.9526760053685255
  -10.240286781275808        13.204312088815593        4.4856524683466175
  -4.6690658488407504       -6.2809313597959449        7.4378900284937082
  -9.5874077836478282       -8.6799071183782903       -1.8203838010218165
  0.62588896716878051       -5.4614995295716540        11.166650096421838
           0        4173
           0        1998
           0         611
           0        8606
           1        6912
           1        9671
           1        7993
           1        8513
           2        5556
           2        4422
           2        3047

我不能简单地使用loadtxt()来读取这样的文件,因为这将导致ValueError: Wrong number of columns at line ...错误

有没有一种方法可以使用loadtxt()或类似的功能来读取此类文件?

我想避免使用readlines()split(),然后再转换为float,因为这会使代码变慢(我认为...)并且更长。我也尝试过pandas.read_csv(),但是我需要一个数组作为输出。

更新:

现在,按照 hpaulj 的建议,我正在使用readlines()split()这样做:
    with open(filename,"r") as f:
        all_data=[x.split() for x in f.readlines()]
        a=array([map(float,x) for x in all_data[:N]])
        b=array([map(int,x) for x in all_data[N+1:]])

它实际上非常快,但是我仍然想知道是否有人知道更快的方法,也许更简单的方法。

最佳答案

我建议使用pandas.read_csv(),然后使用.values中的DataFrame属性获取numpy数组-see documentation

import pandas as pd
import numpy as np

df = pd.read_csv("filename.txt")
array_values = df.values

现在,如果您只使用.values,那么您将获得nan的缺失值。您可以通过检查包含缺少值的M的索引来确定Nnan

关于numpy:带有可变列数的loadtxt(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38201362/

10-10 16:59