对不起,如果这有点长。我有一个.txt文件,其值具有不同的行长度,并且想以python中的矩阵形式读取该文件。文件内容类似于:
1
1
1
6
7,8,3
6,6,8
8,7,1
我想读取文件,然后用零填充行(类似于Matlabs dlmread())以匹配最大行长。我尝试过的方法要么给我一个字符串,要么给我一个不带零的矩阵。任何帮助,将不胜感激。
我的代码:
File_3min = open(File_3min, 'r')
array = File_3min.readlines()
data = []
for i in array:
data.append(i)
numpy_fillna(data)
在不满足最大行长的行中添加零的函数。
import numpy as np
def numpy_fillna(data):
lens = np.array([len(i) for i in data])
mask = np.arange(lens.max()) < lens[:,None]
out = np.zeros(mask.shape, dtype=data.dtype)
out[mask] = np.concatenate(data)
return out
最佳答案
首先,使用上下文with
语句打开文件,以便在完成操作后将其正确关闭,这只是一种很好的做法
with open(File_3min, 'r') as File_3min:
lines = [line.strip().split(',') for line in File_3min]
请注意,我还使用
split(',')
获取每行的列表,并使用strip()
获取所有不包含空格和换行符的行现在,您可以获取如下所示的最大行长:
max_len = max(len(line) for line in lines)
现在,您已经有了一条线的最大长度和线数(使用
len(lines)
),您可以创建一个形状正确的零的numpy数组,稍后填充:my_array = np.zeros([len(lines), max_len])
现在要实际填充数组,您可以执行此操作,这虽然不漂亮,但可以运行:
for i, line in enumerate(lines):
my_array[i, :len(line)] = line
现在,
my_array
中的所有内容都是等长的行/行,并用零填充,该行/行等于文件中的行。关于python - Python导入具有可变行长的文本数组,并将非值转换为零,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45032298/