【问题标题】:How do I use numpy.genfromtxt to read a lower triagular matrix into a numpy array?如何使用 numpy.genfromtxt 将下三角矩阵读入 numpy 数组?
【发布时间】:2015-05-11 22:47:00
【问题描述】:

我有一个像这样的下对角矩阵

1
2 3
4 5 6

在一个文本文件中,我想将它读入一个主对角线上方为零的 numpy 数组。我能想到的最简单的代码

import io
import scipy

data = "1\n2 3\n4 5 6"
scipy.genfromtxt(io.BytesIO(data.encode()))

失败了

ValueError: Some errors were detected !
    Line #2 (got 2 columns instead of 1)
    Line #3 (got 3 columns instead of 1)

这是有道理的,因为在文本文件中,矩阵的上对角线部分没有 任何东西,因此 numpy 不知道将什么解释为缺失值。

查看documentation,我想要invalid_raise = False 之类的选项,但我不想跳过“无效”行。


通过对下面答案的一些修改,我使用的最终代码是

import scipy

with open("data.txt", "r") as r:
    data = r.read()
    n = data.count("\n") + 1
    mat = scipy.zeros((n, n))
    mat[scipy.tril_indices_from(mat)] = data.split()

【问题讨论】:

    标签: python arrays numpy matrix


    【解决方案1】:

    np.tril_indices_from() 可以通过花哨的分号轻松填充数组下三角矩阵:

    data = "1\n2 3\n4 5 6"
    n = len(data.split('\n'))
    data = data.replace('\n', ' ').split()
    
    a = np.zeros((n, n))
    a[np.tril_indices_from(a)] = data
    
    print(a)
    #array([[ 1.,  0.,  0.],
    #       [ 2.,  3.,  0.],
    #       [ 4.,  5.,  6.]])
    

    【讨论】:

    • 这非常有效。我使用n = data.count("\n") + 1而不是拆分字符串,但结果是一样的。此外,您不需要在拆分之前替换换行符,因为没有参数的 string.split() 会在所有空白字符上拆分。请参阅我最终使用的代码的答案。
    猜你喜欢
    • 2022-10-25
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 2019-09-21
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    相关资源
    最近更新 更多