我有一个制表符分隔值的文件,其中文件的前半部分具有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
的索引来确定N
和nan
。关于numpy:带有可变列数的loadtxt(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38201362/