Python导入具有不同行长度的文本数组,并将非值转换为零

时间:2017-07-11 10:43:36

标签: python matlab file

抱歉,如果这有点长。我有一个.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

2 个答案:

答案 0 :(得分:1)

首先,使用上下文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中的所有内容都是等长的行/行,用零填充,是文件中的行。

答案 1 :(得分:0)

该死的,打败了我。我的相似之处:

array = """1
1
1
6
7,8,3
6,6,8
8,7,1""".split('\n')

data = []

for i in array:
    data.append([float(x) for x in i.strip().split(',')])

data_max = max([len(x) for x in data])

out = np.array([x + list(np.zeros(data_max - len(x))) for x in data])