Python导入具有可变行长的文本数组并将非值转换为零

2024-05-20 11:36:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: 文件innumpytxtfordatanp矩阵
2条回答

首先,用context 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中所拥有的是长度相等的行/行,用零填充文件中曾经的行。你知道吗

妈的,比我强。我的类似:

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])

相关问题 更多 >