如何使用numpy.genfromtxt将下三角矩阵读入numpy数组?

3

我有一个如下所示的下三角矩阵

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不知道如何解释缺失值。
查看文档,我想要类似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()
1个回答

2

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

1
这个完美运作。我使用了n = data.count("\n") + 1而不是拆分字符串,但结果是一样的。此外,您不需要在拆分之前替换换行符,因为不带参数的 string.split() 会以所有空白字符进行拆分。请查看我的答案,以获取最终使用的代码。 - Michael A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接