对不起,如果这有点长。我有一个.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/

10-11 08:30